異常處理,是編程語言或電腦硬體里的一種機制,用於處理軟體或信息系統中出現的異常狀況(即超出程式正常執行流程的某些特殊條件)。 1.異常的類型 異常的類型多種多樣,常見的異常有: 其他的異常: Exception可以捕獲任意異常 2.捕獲異常,處理異常 只有將對應的異常類型捕獲才能進行異常的處理 異 ...
異常處理,是編程語言或電腦硬體里的一種機制,用於處理軟體或信息系統中出現的異常狀況(即超出程式正常執行流程的某些特殊條件)。
1.異常的類型
異常的類型多種多樣,常見的異常有:
AttributeError 試圖訪問一個對象沒有的屬性,比如foo.x,但是foo沒有屬性x IOError 輸入/輸出異常;基本上是無法打開文件 ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤 IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊 IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5] KeyError 試圖訪問字典里不存在的鍵 KeyboardInterrupt Ctrl+C被按下 NameError 嘗試訪問一個沒有申明的變數 SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了) TypeError 傳入對象類型與要求的不符合 UnboundLocalError 試圖訪問一個還未被設置的局部變數,基本上是由於另有一個同名的全局變數,導致你以為正在訪問它 ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
其他的異常:
Exception可以捕獲任意異常
BaseException 所有異常的基類 SystemExit 解釋器請求退出 KeyboardInterrupt 用戶中斷執行(通常是輸入^C) Exception 常規錯誤的基類 StopIteration 迭代器沒有更多的值 GeneratorExit 生成器(generator)發生異常來通知退出 StandardError 所有的內建標準異常的基類 ArithmeticError 所有數值計算錯誤的基類 FloatingPointError 浮點計算錯誤 OverflowError 數值運算超出最大限制 ZeroDivisionError 除(或取模)零 (所有數據類型) AssertionError 斷言語句失敗 AttributeError 對象沒有這個屬性 EOFError 沒有內建輸入,到達EOF 標記 EnvironmentError 操作系統錯誤的基類 IOError 輸入/輸出操作失敗 OSError 操作系統錯誤 WindowsError 系統調用失敗 ImportError 導入模塊/對象失敗 LookupError 無效數據查詢的基類 IndexError 序列中沒有此索引(index) KeyError 映射中沒有這個鍵 MemoryError 記憶體溢出錯誤(對於Python 解釋器不是致命的) NameError 未聲明/初始化對象 (沒有屬性) UnboundLocalError 訪問未初始化的本地變數 ReferenceError 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象 RuntimeError 一般的運行時錯誤 NotImplementedError 尚未實現的方法 SyntaxError Python 語法錯誤 IndentationError 縮進錯誤 TabError Tab 和空格混用 SystemError 一般的解釋器系統錯誤 TypeError 對類型無效的操作 ValueError 傳入無效的參數 UnicodeError Unicode 相關的錯誤 UnicodeDecodeError Unicode 解碼時的錯誤 UnicodeEncodeError Unicode 編碼時錯誤 UnicodeTranslateError Unicode 轉換時錯誤 Warning 警告的基類 DeprecationWarning 關於被棄用的特征的警告 FutureWarning 關於構造將來語義會有改變的警告 OverflowWarning 舊的關於自動提升為長整型(long)的警告 PendingDeprecationWarning 關於特性將會被廢棄的警告 RuntimeWarning 可疑的運行時行為(runtime behavior)的警告 SyntaxWarning 可疑的語法的警告 UserWarning 用戶代碼生成的警告
2.捕獲異常,處理異常
只有將對應的異常類型捕獲才能進行異常的處理
異常的捕獲處理方式:
try: #程式執行的代碼,異常檢測的代碼 pass except Exception as e: #捕獲異常後進行的代碼, print(e) pass else: #沒有捕獲到相應的異常後進行的代碼 pass finally: #不論有沒有異常捕獲最後都要執行的代碼 pass
這裡的except就像是java里的catch
也可以在代碼中添加多個except語句來捕獲不同種類型的異常,執行相應不同的操作
3.主動拋出異常
異常的拋出可以手動添加
try: raise Exception("我自己拋的") except Exception as e: print(e)#這裡會輸出“我自己拋的”
4.自定義異常類型
異常的類型我們可以自己定義自己所需要的
主要利用類中的__str__方法實現
class myException(BaseException): def __init__(self,message): self.message=message def __str__(self): return self.message try: raise myException('自定義的異常類型') except myException as e: print(e)
5.斷言
斷言assert用於判斷某個條件是否成立,如果不成立則拋出AssertionError異常,該異常可以捕獲
assert 條件 #相當於 if not 條件 : raise AssertionError() assert 條件,"描述" #相當於 if not 條件 : raise AssertionError("描述")