關(guān)于Python異常處理,你需要了解的知識點(diǎn)
什么是異常?
當(dāng)Python檢測到一個(gè)錯(cuò)誤時(shí),解釋器就無法繼續(xù)執(zhí)行了,并且給出一個(gè)錯(cuò)誤提示。比如寫入文件的時(shí)候,磁盤滿了,寫不進(jìn)去了,或者從網(wǎng)絡(luò)抓取數(shù)據(jù),網(wǎng)絡(luò)突然中斷。這時(shí)候,就需要捕獲處理它,否則程序會終止執(zhí)行。
異常處理
使用try/except/finally語句進(jìn)行捕獲操作,并告訴Python發(fā)生異常時(shí)如何處理。
首先,檢測try語句塊中的錯(cuò)誤,except語句捕獲異常信息并處理。如果在try子句執(zhí)行時(shí)沒有發(fā)生異常,Python將執(zhí)行else語句后的語句,然后控制流通過整個(gè)try語句。
如果在try后的語句里發(fā)生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層,并打印缺省的出錯(cuò)信息。
語法格式
try:# 可能觸發(fā)異常的語句塊except: # 后面跟一個(gè)錯(cuò)誤類型,當(dāng)代碼發(fā)生錯(cuò)誤且錯(cuò)誤類型符合的時(shí)候,就會執(zhí)行except中的代碼,不寫具體錯(cuò)誤類型,表示接收任何類型的異常# 這里執(zhí)行異常處理的相關(guān)代碼,打印輸出等else:# 如果沒有異常則執(zhí)行else中的代碼finally:# 不管代碼是否異常,都會執(zhí)行,一般是資源的關(guān)閉和釋放
excep 異常/錯(cuò)誤 as 別名,使用別名接收異常對象的錯(cuò)誤信息。
如何捕獲多個(gè)異常?
1.寫出多行except 異常/錯(cuò)誤,指定捕獲多個(gè)不同類型的異常。2.使用?except (異常1,異常2..),使用元組,在一行中捕獲多個(gè)不同類型的異常。
異常捕獲示例代碼:
try:print(10/0)except NameError:print('出現(xiàn) NameError 異常')except ZeroDivisionError:print('出現(xiàn) ZeroDivisionError 異常')except IndexError:print('出現(xiàn) IndexError 異常')except Exception as e :print('未知異常',e,type(e))finally :print('無論是否出現(xiàn)異常,該子句都會執(zhí)行')
拋出異常
我們使用raise語句觸發(fā)自定義異常。
語法格式:
raise 異常類名(附加異常信息)示例代碼:s = "asdfghjklqwe"try:if len(s) > 10:raise Exception("超過10個(gè)字符")except Exception as err:print(err)
自定義異常
系統(tǒng)的自帶的異常只要觸發(fā)就會自動拋出,有時(shí)候,用戶自己決定什么時(shí)候拋出,并且給異常加上一些附加信息,這時(shí)候就可以使用自定義異常。
示例代碼:
# 自定義異常類,創(chuàng)建一個(gè)類繼承Exceptionclass MyError(Exception):passdef add(a, b):# a小于0,拋出異常if a < 0:raise MyError('自定義的異常')return a + bprint(add(-1, 5))
異常定義好之后,與內(nèi)置類的用法一樣,在需要的時(shí)候raise出來就可以了。
常見的使用異常的場景
?網(wǎng)絡(luò)請求相關(guān),比如網(wǎng)絡(luò)超時(shí)、連接異常等。?資源訪問相關(guān),比如文件的權(quán)限問題、文件的路徑、文件是否存在等。?代碼邏輯相關(guān),比如越界訪問、KeyError 等。
Python標(biāo)準(zhǔn)異常
異常名稱 | 描述 |
BaseException | 所有異常的基類 |
SystemExit | 解釋器請求退出 |
KeyboardInterrupt | 用戶中斷執(zhí)行(通常是輸入^C) |
Exception | 常規(guī)錯(cuò)誤的基類 |
StopIteration | 迭代器沒有更多的值 |
GeneratorExit | 生成器(generator)發(fā)生異常來通知退出 |
StandardError | 所有的內(nèi)建標(biāo)準(zhǔn)異常的基類 |
ArithmeticError | 所有數(shù)值計(jì)算錯(cuò)誤的基類 |
FloatingPointError | 浮點(diǎn)計(jì)算錯(cuò)誤 |
OverflowError | 數(shù)值運(yùn)算超出最大限制 |
ZeroDivisionError | 除(或取模)零 ?(所有數(shù)據(jù)類型) |
AssertionError | 斷言語句失敗 |
AttributeError | 對象沒有這個(gè)屬性 |
EOFError | 沒有內(nèi)建輸入,到達(dá)EOF 標(biāo)記 |
EnvironmentError | 操作系統(tǒng)錯(cuò)誤的基類 |
IOError | 輸入/輸出操作失敗 |
OSError | 操作系統(tǒng)錯(cuò)誤 |
WindowsError | 系統(tǒng)調(diào)用失敗 |
ImportError | 導(dǎo)入模塊/對象失敗 |
LookupError | 無效數(shù)據(jù)查詢的基類 |
IndexError | 序列中沒有此索引(index) |
KeyError | 映射中沒有這個(gè)鍵 |
MemoryError | 內(nèi)存溢出錯(cuò)誤(對于Python 解釋器不是致命的) |
NameError | 未聲明/初始化對象 (沒有屬性) |
UnboundLocalError | 訪問未初始化的本地變量 |
ReferenceError | 弱引用(Weak reference)試圖訪問已經(jīng)垃圾回收了的對象 |
RuntimeError | 一般的運(yùn)行時(shí)錯(cuò)誤 |
NotImplementedError | 尚未實(shí)現(xiàn)的方法 |
SyntaxError | Python 語法錯(cuò)誤 |
IndentationError | 縮進(jìn)錯(cuò)誤 |
TabError | Tab 和空格混用 |
SystemError | 一般的解釋器系統(tǒng)錯(cuò)誤 |
TypeError | 對類型無效的操作 |
ValueError | 傳入無效的參數(shù) |
UnicodeError | Unicode 相關(guān)的錯(cuò)誤 |
UnicodeDecodeError | Unicode 解碼時(shí)的錯(cuò)誤 |
UnicodeEncodeError | Unicode 編碼時(shí)錯(cuò)誤 |
UnicodeTranslateError | Unicode 轉(zhuǎn)換時(shí)錯(cuò)誤 |
Warning | 警告的基類 |
DeprecationWarning | 關(guān)于被棄用的特征的警告 |
FutureWarning | 關(guān)于構(gòu)造將來語義會有改變的警告 |
OverflowWarning | 舊的關(guān)于自動提升為長整型(long)的警告 |
PendingDeprecationWarning | 關(guān)于特性將會被廢棄的警告 |
RuntimeWarning | 可疑的運(yùn)行時(shí)行為(runtime behavior)的警告 |
SyntaxWarning | 可疑的語法的警告 |
UserWarning | 用戶代碼生成的警告 |
推薦閱讀

