語法錯誤和邏輯錯誤是寫程式的人永遠的痛,但些問題並非難解,只要經過測試和偵錯還是能處理的,相較之下,執行錯誤就比較令人頭痛了,因為它可能跟系統環境、外部資源相關,甚是可以牽扯到硬體設備,所以為了更有效的對付這種BUG,我們就要使用例外處理了
將可能會出錯的程式碼放在try
的區塊下,當try
的區塊裡面出現錯誤時,就執行except
區塊內的程式碼,可想而知,程式錯誤千百種,except
區塊預設為只要發生錯誤就執行,當然,except
區塊也能設定成只有發生特定的錯誤才執行,這種設定稱為錯誤捕捉,操作方式如下
try:
程式區塊......
except:
如果上方程式發生錯誤,則執行此程式區塊
錯誤捕捉的方式為,在except
後方加上異常名稱,就可以設定成當發生該異常時在執行except
區塊,至於異常名稱有哪些呢?我們可以看一下python標準異常這個東西
異常名稱 | 描述 |
---|---|
BaseException | 所有異常的基類 |
SystemExit | 直譯器請求退出 |
KeyboardInterrupt | 使用者中斷執行(通常是輸入^C) |
Exception | 常規錯誤的基類 |
StopIteration | 迭代器沒有更多的值 |
GeneratorExit | 生成器(generator)發生異常來通知退出 |
SystemExit | Python 直譯器請求退出 |
StandardError | 所有的內建標準異常的基類 |
ArithmeticError | 所有數值計算錯誤的基類 |
FloatingPointError | 浮點計算錯誤 |
OverflowError | 數值運算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有資料型別) |
AssertionError | 斷言語句失敗 |
AttributeError | 物件沒有這個屬性 |
EOFError | 沒有內建輸入,到達EOF 標記 |
EnvironmentError | 作業系統錯誤的基類 |
IOError | 輸入/輸出操作失敗 |
OSError | 作業系統錯誤 |
WindowsError | 系統呼叫失敗 |
ImportError | 匯入模組/物件失敗 |
KeyboardInterrupt | 使用者中斷執行(通常是輸入^C) |
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 | 使用者程式碼生成的警告 |
操作方式如下 |
try:
程式區塊......
except 異常名稱 as 異常名稱別名:
如果上方程式發生指定的異常,則執行此程式區塊
範例
try:
# 讀取myfile.ext檔案
files = open( "./myfile.ext" , mode = "r" , encoding = "utf-8" )
except IOError as e:
# 如果myfile.ext檔案不存在,就會觸發IO錯誤,執行以下區塊
print(e)
print("檔案不存在")
還有捕捉多重錯誤的方式
try:
程式區塊......
except (異常名稱1,異常名稱2) as 異常名稱別名A:
如果上方程式發生指定的異常,則執行此程式區塊
except (異常名稱3,異常名稱4) as 異常名稱別名B:
如果上方程式發生指定的異常,則執行此程式區塊
另外再來題一下try...except...else...finally...敘述,else...finally...並不是絕對必要的敘述,else
區塊在try
區塊正常的執行完成後會執行,也就是說沒有發生異常才會執行,finally
區塊就是無論如何最終一定會執行,操作如下
try:
程式區塊......
except (異常名稱1,異常名稱2) as 異常名稱別名A:
如果上方程式發生指定的異常,則執行此程式區塊
except (異常名稱3,異常名稱4) as 異常名稱別名B:
如果上方程式發生指定的異常,則執行此程式區塊
...如果有需要可以繼續增加except區塊
else:
try區塊順利執行完畢,沒有發生任何錯誤時執行
finally:
無論如何最後都會執行