Python 異常處理
程序出錯時,會拋出異常,這想必在之前學習過程中已經見過不少。 這邊具體說明下Python 的標准異常、如何捕捉異常、拋出異常 以及自定義異常。
python 標准異常
我們先來制造一個標准異常 如 print (1/0)
顯然,這邊報了一個 ZeroDivisionError,具體報錯為 ZeroDivisionError,錯誤信息為 integer division or modulo by zero ;這就是 python 中的標准異常之一。
Python 標准異常的相關參考,參見:http://www.cnblogs.com/feeland/p/4453574.html
捕捉異常
類似於 java、C# 中的 try catch,Python 使用 try except 語句來捕捉異常。具體方式如下:
try: 下的代碼段 即為 需要捕捉異常的代碼段;
except: 捕獲某一模塊的異常,須帶異常模塊名稱,可帶原因參數;except 下代碼為該異常發生時,所執行的代碼;一個try可對應多個except子句
(異常模塊名稱參見上方的介紹,也可以是自定義的異常模塊,這在后面會詳細介紹)
注意:Python 2 和 3 在異常原因這邊的處理比較不同 ,Python2 語句為:, 后面帶原因變量名;Python3 的語句為 異常模塊名 as 原因變量名
Python 中處理異常也可加入 else 及 finally 語句,具體功能如下:
else: else 只可在所有 except 子句之后,且只有一個;其語句為所有 except 子句均沒有發生異常時執行的代碼 (若有其他異常,則報錯而不執行)
finally: 無論異常發生還是不發生,捕獲還是不捕獲都會執行的代碼段;try ... finally 可做定義清理行為,在真實場景的應用程序中, finally 子句用於釋放外部資源(文件或網絡連接之類的),無論它們的使用過程中是否出錯。
舉些例子來具體說明下異常捕捉:
1. 簡單的 try ... except 可見,Python2 和 3 處理 except 子句的語法有點不同,需要注意;
后續的例子以python2為主,python3 的請適當更改處理
Python2
try: print (1/0) except ZeroDivisionError, err: # , 加原因參數名稱
print ('Exception: ', err)
Python3
try: print (1/0) except ZeroDivisionError as err: # as 加原因參數名稱
print ('Exception: ', err)
2. 有關異常名稱,如果能明確判斷需要捕捉的異常模塊,如文件讀寫,可捕捉 IOError;算數相關,捕捉ArithmeticError 等。但若不清楚當前代碼可能發生的異常模塊,可使用較大范圍的異常父類模塊,如 StandardError < Exception < BaseException ;具體查 http://www.cnblogs.com/feeland/p/4453574.html
如下代碼中,所有except子句其實均可單獨使用,越下范圍越廣,可試着注釋部分except子句來運行查看效果
1 try: 2 print (1/0) 3 except ZeroDivisionError as err: # 除數為0報錯
4 print ('Exception: ', err) 5 except ArithmeticError as err: # 算數錯誤
6 print ('Exception: ', err) 7 except StandardError as err: # 所有的內建標准異常的基類 包含上述類
8 print ('Exception: ', err) 9 except Exception as err: # 常規錯誤的基類
10 print ('Exception: ', err) 11 except BaseException as err: # 所有異常的基類
12 print ('Exception: ', err) 13 else: 14 print ("no errors") 15 finally: 16 print ("no matter what, it will always be here.")
這邊 else 下的代碼沒有執行,因為其中 except 子句捕捉到了異常;finally 語句下的代碼無論何種情況均會執行;
3. 若try下的代碼無異常,則會正常執行,else語句也會執行
4. 若try下的代碼有異常,但所有except子句均未捕捉到異常,仍會報錯,else語句不執行;finally語句始終執行
拋出異常
當程序出現錯誤,python會自動引發異常,也可以通過 raise 強制引發異常。一旦執行了raise 語句,raise后面的語句將不能執行。
raise [Exception [, args [, traceback]]]
Exception是異常的類型(例如,NameError)參數是一個異常參數值。該參數是可選的,如果不提供,異常的參數是"None"。舉例如下
強制引發的異常,也可以被 try... except... 捕獲,這邊由於raise的參數未帶原因參數,故輸出為空,如下
自定義異常
通過創建一個新的異常類,用戶可以自定義異常。異常應該是典型的繼承自Exception類,通過直接或間接的方式,比如 class exception_name(Exception): 。自定義異常使用 raise 語句引發,而且只能通過人工方式觸發。
如果要拋出自定義異常,首先根據需要,可以定義一個異常的class,選擇好繼承關系,然后,用raise語句拋出一個異常的實例。
如改寫上方示例,raise 自定義 Exception levelError
如自定義 Exception 繼承 RuntimeError,可定義 __init__ 帶一參數,並做 try... except 捕獲改異常,參考如下代碼