1. 程式人生 > >Python Exceptions 異常處理全過程以及異常模組詳細解析

Python Exceptions 異常處理全過程以及異常模組詳細解析

1.異常的定義

程式執行時檢測到錯誤而導致直譯器無法繼續執行,反而出現一些錯誤的提示

2.捕捉異常全過程(重點)

    try:
        print("可能產生異常的程式碼")
    except Exception as e:
        print("處理異常錯誤的程式碼")
    else:
        print("沒有捕獲到異常")
    finally:
        print("無論異常是否產生都要執行")

總結:

  • try:

處理可能產生異常的程式碼

  • except

處理異常錯誤的程式碼
如果只捕捉一個異常,一般寫成except Exception as e:


捕獲多個異常時,except (IOError,NameError) as e:其中元祖中的異常可以根據程式碼需求填寫.
當捕獲多個異常時,可以把要捕獲的異常的名字,放到except 後,並使用元組的方式僅進行儲存

  • else

沒有捕獲到異常時執行

  • finally

無論異常是否產生都要執行部分,比如檔案關閉,釋放鎖,把資料庫連線返還給連線池等

3.異常的傳遞

異常的傳遞主要有try巢狀方式和函式巢狀呼叫2種方式:

  • 如果try巢狀,那麼如果裡面的try沒有捕獲到這個異常,那麼外面的try會接收到這個異常,然後進行處理,如果外邊的try依然沒有捕獲到,那麼再進行傳遞
  • 如果一個異常是在一個函式中產生的,例如函式A---->函式B---->函式C,而異常是在函式C中產生的,那麼如果函式C中沒有對這個異常進行處理,那麼這個異常會傳遞到函式B中,如果函式B有異常處理那麼就會按照函式B的處理方式進行執行;如果函式B也沒有異常處理,那麼這個異常會繼續傳遞,以此類推。。。如果所有的函式都沒有處理,那麼此時就會進行異常的預設處理

4.自定義異常以及丟擲異常raise

    class MyError(Exception): 
        # 自定義異常,必須繼承 Exception
    
        def __init__(self, age):
            self.age = age
    
        def __str__(self):  
            # __str__返回的字串就是異常的描述資訊
            return '年齡不能小於 0, 您輸入的是 %d' % self.age
    
    
    age = int(input('請輸入年齡:'))
    try:
        if age < 0:
            raise MyError(age)  # 丟擲異常,raise 異常名()
    except MyError as exp:
        print('捕捉到異常,exp=', exp)

5.異常模組

Exceptions 模組提供了標準異常的層次結構. Python啟動的時候會自動匯入 這個模組, 並且將它加入到__builtin__模組中. 也就是說, 一般不需要手動匯入這個模組.

  • Exception 是所有異常的基類. 強烈建議(但不是必須)自定義的異常異 常也繼承這個類.
  • SystemExit(Exception) 由 sys.exit 函式引發. 如果它在最頂層沒有被 try-except 語句捕獲, 那麼直譯器將直接關閉而不會顯示任何跟蹤 返回資訊.
  • StandardError(Exception) 是所有內建異常的基類(除 SystemExit 外).
  • KeyboardInterrupt(StandardError) 在使用者按下 Control-C(或其他打 斷按鍵)後 被引發. 如果它可能會在你使用 “捕獲所有” 的 try-except 語句時導致奇怪的問題.
  • ImportError(StandardError) 在 Python 匯入模組失敗時被引發.
  • EnvironmentError 作為所有直譯器環境引發異常的基類. (也就是說, 這些異常一般不是由於程式 bug 引起).
  • IOError(EnvironmentError) 用於標記 I/O 相關錯誤.
  • OSError(EnvironmentError) 用於標記 os 模組引起的錯誤.
  • WindowsError(OSError) 用於標記 os 模組中 Windows 相關錯誤.
  • NameError(StandardError) 在 Python 查詢全域性或區域性名稱失敗時被引 發.
  • UnboundLocalError(NameError) , 當一個區域性變數還沒有賦值就被使用 時, 會引發這個異常. 這個異常只有在 2.0 及之後的版本有; 早期版本 只會引發一個普通的 NameError .
  • AttributeError(StandardError) , 當 Python 尋找(或賦值)給一個實 例屬性, 方法, 模組功能或其它有效的命名失敗時, 會引發這個異常.
  • SyntaxError(StandardError) , 當直譯器在編譯時遇到語法錯誤, 這個異常就被引發.
  • IndentationError(SyntaxError) 在遇到非法的縮排時被引發. 該異常只用於 2.0 及以後版本, 之前版本會引發一個 SyntaxError 異常.
  • TabError(IndentationError) , 當使用 -tt 選項檢 查不一致縮排時有可能被引發. 該異常只用於 2.0 及以後版本, 之前版 本會引發一個SyntaxError 異常.
  • TypeError(StandardError) , 當給定型別的物件不支援一個操作時被引 發.
  • AssertionError(StandardError) 在 assert 語句失敗時被引發(即表達 式為 false 時).
  • LookupError(StandardError) 作為序列或字典沒有包含給定索引或鍵時所引發異常的基類.
  • IndexError(LookupError) , 當序列物件使用給定索引數索引失敗時(不存在索引對應物件)引發該異常.
  • KeyError(LookupError) 當字典物件使用給定索引索引失敗時(不存在索 引對應物件)引發該異常.
  • ArithmeticError(StandardError) 作為數學計算相關異常的基類.
  • OverflowError(ArithmeticError) 在操作溢位時被引發(例如當一個整 數太大, 導致不能符合給定型別).
  • ZeroDivisionError(ArithmeticError) , 當你嘗試用 0 除某個數時被引發.
  • FloatingPointError(ArithmeticError) , 當浮點數操作失敗時被引發.
  • ValueError(StandardError) , 當一個引數型別正確但值不合法時被引 發.
  • UnicodeError(ValueError) , Unicode 字串型別相 關異常. 只使用在 2.0 及以後版本.
  • RuntimeError(StandardError) , 當出現執行時問題時引發, 包括在限制模式下嘗試訪問外部內容, 未知的硬體問題等等.
  • NotImplementedError(RuntimeError) , 用於標記未實現的函式, 或無效的方法.
  • SystemError(StandardError) , 直譯器內部錯誤. 該異常值會包含更多的細節 (經常會是一些深層次的東西, 比如 “eval_code2: NULL globals” ) .
  • MemoryError(StandardError) , 當直譯器耗盡記憶體時會引發該異常. 注 意只有在底層記憶體分配抱怨時這個異常才會發生; 如果是在你的舊機器 上, 這個異常發生之前系統會陷入混亂的記憶體交換中.

你可以建立自己的異常類(參考第四點). 只需要繼承內建的 Exception 類(或者它的任意一個合適的子類)即可, 有需要時可以再過載它的__str__方法 ,一般常見的異常類有:

Exception
KeyboardInterrupt
ImportError
NameError
AttributeError
SyntaxError
TypeError
IndexError
KeyError
ValueError

以上內容僅是代表個人總結 若有錯誤之處,還請批評指正,歡迎大家一起學習!