Python核心編程第十章

10.1什麼是異常python

    10.1.1錯誤程序員

                語法錯誤  :軟件結構上有誤,致使不能被解釋器或編譯器沒法編譯編程

                邏輯錯誤:不完整或不合法的輸入所致安全

    10.1.2異常函數

                  程序出現了錯誤而在正常控制流之外採起的行爲:1.引起異常發生的錯誤 2.檢測階段code

10.2 python中的異常對象

    1 NameError字符串

    2.ZeroDivisionErrorinput

    3.SyntaxError編譯器

    4.IndexError

    5.KeyError

    6.IOError

    7.AttributeError

10.3 檢測和處理異常

    try-except     一個try語句能夠對應一個或多個except語句

    try-finally       一個try語句只能對應一個finally語句 或是一個try-except-finally複合語句     finally是不管異常是否發生都會執行的一段代碼

    字符串化異常參數: ....except(ValueError,TypeError),diag:

else語句:在else範圍中的任何代碼運行前,try範圍中的全部代碼必須徹底成功  try:   except:  else:

10.4 上下文管理

    10.4.1  with語句

    僅能支持上下文管理協議

10.6 觸發異常

raise語句

10.7 斷言

    斷言一句等價於布爾真的斷定:此外,發生異常也意味着表達式爲假

10.10爲何要用異常

    面對錯誤,應用應該成功的停止,不至於災難性的影響其執行環境。python異常處理促使成熟和正確的編程

10.11到底爲何要異常

    試想Python沒有程序級的異常處理:1.須要擔憂的是客戶端程序員在本身代碼中遺忘控制

                                                               2.函數必須重寫來爲 錯誤的情形來返回一個‘特殊’的值

 

10.12 異常和sys模塊

    另外一種獲取異常信息的途徑是經過sys模塊中exc_info()函數。此功能提供了一個3元組(3-tuple)

的信息。sys.exc_info()

sys.exc_info()獲得的元組是:

exc_type:異常類

exc_value:異常類的實類

exc_traceback 跟蹤記錄對象

 

 

10.14練習

10-1  e

10-2   d

10-3 raise

10-4 

   try-except     一個try語句能夠對應一個或多個except語句

    try-finally       一個try語句只能對應一個finally語句 或是一個try-except-finally複合語句     finally是不管異常是否發生都會執行的一段代碼

10-5

    a. SyntaxError

    b.IndexError

    c.NameError

    d.ZeroDivisionError

    e.ValueError

    

10-6     改進的 open(). 

爲內建的 open() 函數建立一個封裝. 使得成功打開文件後, 返回文件句柄; 若打開失敗則返回給調用者 None , 而不是生成一個異常. 這樣你打開文件時就不須要額外的異常處理語句

def new_open(infile):
    try:
        fobj = open(infile,'r')
    except IOError:
        fobj = None
    return fobj

if __name__=='__main__':
    print new_open('test')

 

 10.7 異常

        1.若A異常,則(a)和(b)中的B都不會執行

        2.若A正常,(a)(b)都會執行B,但若B異常,b中會對異常作出處理,a中則會把異常拋給上層調用者

       

10.8改進的 raw_input() . 本章的開頭, 咱們給出了一個"安全"的 float() 函數,它創建在內建函數 float() 上, 能夠檢測並處理 float() 可能會引起的兩種不一樣異常. 一樣,raw_input() 函數也可能會生成兩種異常, EOFError (文件末尾 EOF, 在 Unix 下是因爲按下了Ctrl+D 在 Dos 下是由於 Ctrl+Z) 或是 KeyboardInterrupt ( 取消輸入, 通常是因爲按下了Ctrl+C). 請建立一個封裝函數 safe_input() , 在發生異常時返回 None

def safe_input(prompt):
    try:
        retval = raw_input(prompt)
        return retval
    except(EOFError,KeyboardInterrupt):
        return None

if __name__ == '__main__':
    safe_input("input some words")

10.9  改進的 math.sqrt(). math 模塊包含大量用於處理數值相關運算的函數和常量. 不幸的是, 它不能識別複數, 因此咱們建立了 cmath 模塊來支持複數相關運算. 請建立一個safe_sqrt() 函數, 它封裝 math.sqrt() 並能處理負值, 返回一個對應的複數.

import math

def safe_sqrt(num):
    try:
        result = math.sqrt(num)
    except ValueError:
        import cmath
        result = cmath.sqrt(num)
    return result
相關文章
相關標籤/搜索