Python學習(八)異常處理


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 捕獲改異常,參考如下代碼

    

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM