Python中的異常處理
1.異常類型
異常名稱
?
描述
?
BaseException
?
所有異常的基類
?
SystemExit
?
解釋器請求退出
?
KeyboardInterrupt
?
用戶中斷執(zhí)行(通常是輸入^C)
?
Exception
?
常規(guī)錯誤的基類
?
StopIteration
?
迭代器沒有更多的值
?
GeneratorExit
?
生成器(generator)發(fā)生異常來通知退出
?
StandardError
?
所有的內(nèi)建標準異常的基類
?
ArithmeticError
?
所有數(shù)值計算錯誤的基類
?
FloatingPointError
?
浮點計算錯誤
?
OverflowError
?
數(shù)值運算超出最大限制
?
ZeroDivisionError
?
除(或取模)零 (所有數(shù)據(jù)類型)
?
AssertionError
?
斷言語句失敗
?
AttributeError
?
對象沒有這個屬性
?
EOFError
?
沒有內(nèi)建輸入,到達EOF 標記
?
EnvironmentError
?
操作系統(tǒng)錯誤的基類
?
IOError
?
輸入/輸出操作失敗
?
OSError
?
操作系統(tǒng)錯誤
?
WindowsError
?
系統(tǒng)調(diào)用失敗
?
ImportError
?
導(dǎo)入模塊/對象失敗
?
LookupError
?
無效數(shù)據(jù)查詢的基類
?
IndexError
?
序列中沒有此索引(index)
?
KeyError
?
映射中沒有這個鍵
?
MemoryError
?
內(nèi)存溢出錯誤(對于Python 解釋器不是致命的)
?
NameError
?
未聲明/初始化對象 (沒有屬性)
?
UnboundLocalError
?
訪問未初始化的本地變量
?
ReferenceError
?
弱引用(Weak reference)試圖訪問已經(jīng)垃圾回收了的對象
?
RuntimeError
?
一般的運行時錯誤
?
NotImplementedError
?
尚未實現(xiàn)的方法
?
SyntaxError
?
Python 語法錯誤
?
IndentationError
?
縮進錯誤
?
TabError
?
Tab 和空格混用
?
SystemError
?
一般的解釋器系統(tǒng)錯誤
?
TypeError
?
對類型無效的操作
?
ValueError
?
傳入無效的參數(shù)
?
UnicodeError
?
Unicode 相關(guān)的錯誤
?
UnicodeDecodeError
?
Unicode 解碼時的錯誤
?
UnicodeEncodeError
?
Unicode 編碼時錯誤
?
UnicodeTranslateError
?
Unicode 轉(zhuǎn)換時錯誤
?
Warning
?
警告的基類
?
DeprecationWarning
?
關(guān)于被棄用的特征的警告
?
FutureWarning
?
關(guān)于構(gòu)造將來語義會有改變的警告
?
OverflowWarning
?
舊的關(guān)于自動提升為長整型(long)的警告
?
PendingDeprecationWarning
?
關(guān)于特性將會被廢棄的警告
?
RuntimeWarning
?
可疑的運行時行為(runtime behavior)的警告
?
SyntaxWarning
?
可疑的語法的警告
?
UserWarning
?
用戶代碼生成的警告
?
2.異常處理
1)try/except語句
捕捉異常通常用try(捕捉錯誤)/except(處理錯誤)語句。如果你不想在異常發(fā)生時結(jié)束你的程序,只需在try里捕獲它。異??蓭?shù),用于說明異常原因
?
try:
????fh = open("testfile", "w")
????fh.write("這是一個測試文件,用于測試異常!!")
except (IOError,RuntimeError): ?# 當出現(xiàn)這兩種error中的一種時,執(zhí)行except后面的操作
????print("Error: 沒有找到文件或讀取文件失敗")
except Exception as e: ?# 使用異常基類捕獲
????print("Error: 出錯")
else:
????print("內(nèi)容寫入文件成功")
????fh.close()
?
?
2)try/finally語句
try-finally 語句無論是否發(fā)生異常都將執(zhí)行最后的代碼。
?
try:
????fh = open("testfile", "w")
????fh.write("這是一個測試文件,用于測試異常!!")
finally:
????print("Error: 沒有找到文件或讀取文件失敗")
3.自己設(shè)置異常(用于bug修改、錯誤檢查)
我們可以使用raise語句自己觸發(fā)異常
?
raise語法格式如下:
?
raise [Exception [, args [, traceback]]]
語句中Exception是異常的類型(例如,NameError)參數(shù)是一個異常參數(shù)值。該參數(shù)是可選的,如果不提供,異常的參數(shù)是"None"。
?
最后一個參數(shù)是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。例子如下:
?
def functionName( level ):
????if level < 1:
????????raise Exception("Invalid level!", level)
????????# 觸發(fā)異常后,后面的代碼就不會再執(zhí)行
對于自定義的異常,在使用except語句處理異常時,一定要將Exception中的異常名作為except語句的一個參數(shù)。例子如下:
?
try:
????#正常邏輯
except "Invalid level!":
????#觸發(fā)自定義異常
else:
????#其余代碼
?
4.自己創(chuàng)建異常類型,用于常見異常復(fù)用
一個異??梢允且粋€字符串,類或?qū)ο蟆?/p>
?
class Networkerror(RuntimeError): ?# 基于RuntimeError類創(chuàng)建一個新的類
????def __init__(self, arg): ?# 定義一個函數(shù)
????????self.args = arg
?
?
?
?
try:
????raise Networkerror("Bad hostname") ?#拋出一個Networkerror異常
except Networkerror as e: ?#匹配異常的類型,當出現(xiàn)了Networkerror型異常時,執(zhí)行該except語句,并傳遞變量e,變量 e 是用于創(chuàng)建Networkerror類的實例,這里的e應(yīng)該就是這個異常對象?
????print(e.args)
?
??