Python Exceptions 異常處理全過程以及異常模組詳細解析
阿新 • • 發佈:2018-12-19
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