python常用功能介紹之二:異常處理

與其他語言相同,在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 用戶代碼生成的警告

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章