Python學習(八)異常處理

Python 異常處理

  程序出錯時,會拋出異常,這想必在以前學習過程當中已經見過很多。 這邊具體說明下Python 的標準異常、如何捕捉異常、拋出異常 以及自定義異常。html

  python 標準異常

    咱們先來製造一個標準異常 如 print (1/0)    java

    顯然,這邊報了一個 ZeroDivisionError,具體報錯爲 ZeroDivisionError,錯誤信息爲 integer division or modulo by zero ;這就是 python 中的標準異常之一。python

    Python 標準異常的相關參考,參見:http://www.cnblogs.com/feeland/p/4453574.html網絡

  

  捕捉異常

    相似於 java、C# 中的 try catch,Python 使用 try except 語句來捕捉異常。具體方式以下:學習

      try:        下的代碼段 即爲 須要捕捉異常的代碼段;spa

      except:  捕獲某一模塊的異常,須帶異常模塊名稱,可帶緣由參數;except 下代碼爲該異常發生時,所執行的代碼;一個try可對應多個except子句code

                (異常模塊名稱參見上方的介紹,也能夠是自定義的異常模塊,這在後面會詳細介紹)htm

                  注意:Python 2 和 3 在異常緣由這邊的處理比較不一樣 ,Python2 語句爲:, 後面帶緣由變量名;Python3 的語句爲 異常模塊名 as 緣由變量名blog

 

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

    

相關文章
相關標籤/搜索