語法錯誤和邏輯錯誤是寫程式的人永遠的痛,但些問題並非難解,只要經過測試和偵錯還是能處理的,相較之下,執行錯誤就比較令人頭痛了,因為它可能跟系統環境、外部資源相關,甚是可以牽扯到硬體設備,所以為了更有效的對付這種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:
無論如何最後都會執行