程序員總是和各種錯誤打交道,學習如何識別并正確的處理程序錯誤是很有必要的。
7.1錯誤和異常
1、錯誤
從軟件方面來看,錯誤分為語法錯誤和邏輯錯誤兩種。這兩種錯誤都將導致程序無法正常進行下去,當Python檢測到一個錯誤時就出現了異常。
2、異常
當編譯器檢測到錯誤并且意識到錯誤條件。解釋器會引發一個異常(程序員也可以自己引發一個異常,后面會說到)。
以下是7種Python中常見的錯誤。
1、NameError,嘗試訪問一個未申明的例子。
2、ZeroDivisionError,零除錯誤。
3、SynataxError,解釋器語法錯誤。
4、IndexError,請求的索引超出范圍。
5、KeyError,請求一個不存在的字典Key。
6、IOError,輸入輸出錯誤,例如嘗試打開一個不存在的文件。
7、AttributeError,嘗試訪問 為未知的對象屬性。
7.2異常檢測和異常處理
7.2.1 try-excep語句
try: FileTest=open('blash','r')except IOError,e: PRint 'could not open file'
此時當發生輸入輸出錯誤的時候程序不會停止,而是捕獲異常顯示預先定義的字符串。需要注意的是只有當捕獲IOError時會執行print語句,當發生其他類型的異常時程序仍會停止,此時我們我們可能需要帶多個except的try語句。
7.2.2帶有多個except的try語句
可以將多個except語句連起來,如下所示
except Exception1[,reason1]:
suit_for_exception1
except Exception2[,reason2]:
sut_for_exception2
程序執行時未發生錯誤忽略所有except語句,如果發生異常則在多個except語句中查找匹配的異常。這樣開發時既能捕獲多種類型異常,幫助我們處理錯誤。
7.2.3捕獲所有異常
根據上面帶多個except的語句可以捕獲多種異常,但事實上程序總會發生我們意想不到的異常,所有如果可以捕獲所有異常而不僅限于我們指定的異常那么對開發將有比較大的幫助。
但是捕獲所有所有異常有個缺陷,就是它不會告訴你到底捕獲了什么異常,也無法讓你應對不同類型的異常。
它的用法是:
try: except (KeyboardInterrupt,SystemExit): #user wants quit raiseexcept Exception: #handle real Errors
需要解釋的是KeyboardInterrupt,SystemExit并不是真正意義上的異常,前者是用戶按下Ctrl+C后者表示程序需要退出,所以想要程序正常退出時不被捕獲異常需要上面的代碼。
7.2.4獲取異常原因
捕獲異常后只有得到異常發生的原因才能幫助我們改進。
except語句的使用:
except exception[,reason]
括號中的reason即是異常的原因,異常參數。異常參數可以忽略,如果需要訪問異常的原因那么reason則是必須的。reason是包含導致異常的代碼的診斷信息的類實例,雖然從異常的名字就可以獲知發生了何種異常,但是reason將提供更多的異常信息。
用法如下:
def safe_float(object): try: retval=float(object) except (ValueError,TypeError),reason: retval=str(reason) return retvalprint safe_float('xyz')
程序將顯示could not convert string to float: xyz,是的編譯器返回了具體的錯誤原因。
7.2.5 else 語句
我們已經見過if-else,while-else語句,try-except-else當然也是可以使用的,其意義是在try范圍內沒有異常檢查到則執行else語句。
7.2.6 finally語句
try-except-finally中的finally子句表示無論是否捕獲到異常都將執行的一段代碼。當然"try-except-else-finally"也是完全可以搭配的。很簡單不在多說,需要注意的是except語句可以有不止一個,但是至少要有一個。else和finally都是可選的。
7.3異常觸發
7.3.1 raise語句
有時我們可能需要引發一個異常,此時需要raise語句。使用如下:
raise [SomeException[,args[,traceback]]]
第一個參數SomeException是必要的,你需要提供要引發的異常名。第二個參數args是將參數傳遞給異常;第三個參數是用于異常-正常化(exception-narmally)的跟蹤記錄(traceback)記錄。當程序運行到raise語句時會跳出并引發你需要的異常。
7.4斷言
7.4.1 斷言可以理解為(raise if not...)當布爾值為假時拋出異常。斷言關鍵字為assert,用法如下:
assert expression[,arguments]
表達式后面是我們提供的異常參數。
新聞熱點
疑難解答