與其他語言相同,在python中,try/except語句主要是用於處理程序正常執行過程中出現的一些異常情況,如語法錯誤(python作爲腳本語言沒有編譯的環節,在執行過程中對語法進行檢測,出錯後發出異常消息)、數據除零錯誤、從未定義的變量上取值等;而try/finally語句則主要用於在無論是否發生異常情況,都需要執行一些清理工作的場合,如在通信過程中,無論通信是否發生錯誤,都需要在通信完成或者發生錯誤時關閉網絡連接。儘管try/except和try/finally的作用不同,但是在編程實踐中通常可以把它們組合在一起使用try/except/else/finally的形式來實現穩定性和靈活性更好的設計。
默認情況下,在程序段的執行過程中,如果沒有提供try/except的處理,腳本文件執行過程中所產生的異常消息會自動發送給程序調用端,如python shell,而python shell對異常消息的默認處理則是終止程序的執行並打印具體的出錯信息。這也是在python shell中執行程序錯誤後所出現的出錯打印信息的由來。
python中try/except/else/finally語句的完整格式如下所示:
try:
執行語句
except A:
處理異常A
except B:
處理異常B
except:
處理其他異常
else:
處理正常情況
finally:
處理所有情況
說明:
正常執行的程序在try下面的“執行語句”中執行,在執行過程中如果發生了異常,則中斷當前執行跳轉到對應的異常處理塊中開始執行;
python依次匹配各個except,如果找到了對應的exception類型則進入其提供的異常處理執行塊中進行處理。except塊是可選項,如果沒有提供,該exception將會被提交給python進行默認處理,處理方式則是終止應用程序並打印提示信息;
如果在“執行語句”執行塊中執行沒有發生任何異常,則在執行完後會進入else執行塊中(如果存在的話)執行。
無論是否發生了異常,只要提供了finally語句,以上try/except/else/finally代碼塊執行的最後一步總是執行finally所對應的代碼塊。
需要注意的是:
1. 在上面所示的完整語句中try/except/else/finally所出現的順序必須是try-->exceptX-->except-->else-->finally,即所有的except必須在else和finally之前,else(如果有的話)必須在finally之前,而except X必須在except之前。否則會出現語法錯誤。
2. 對於上面所展示的try/except完整格式而言,else和finally都是可選的,而不是必須的,但是如果存在的話else必須在finally之前,finally(如果存在的話)必須在整個語句的最後位置。
3. 在上面的完整語句中,else語句的存在必須以except X或者except語句爲前提,如果在沒有except語句的try block中使用else語句會引發語法錯誤。也就是說else不能與try/finally配合使用。
最後,附上異常類型:
異常名稱 | 描述 |
---|---|
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 | 用戶代碼生成的警告 |