關(guān)于Python異常處理,你需要了解的知識點
什么是異常?
當Python檢測到一個錯誤時,解釋器就無法繼續(xù)執(zhí)行了,并且給出一個錯誤提示。比如寫入文件的時候,磁盤滿了,寫不進去了,或者從網(wǎng)絡(luò)抓取數(shù)據(jù),網(wǎng)絡(luò)突然中斷。這時候,就需要捕獲處理它,否則程序會終止執(zhí)行。
異常處理
使用try/except/finally語句進行捕獲操作,并告訴Python發(fā)生異常時如何處理。
首先,檢測try語句塊中的錯誤,except語句捕獲異常信息并處理。如果在try子句執(zhí)行時沒有發(fā)生異常,Python將執(zhí)行else語句后的語句,然后控制流通過整個try語句。
如果在try后的語句里發(fā)生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層,并打印缺省的出錯信息。
語法格式
try:# 可能觸發(fā)異常的語句塊except: # 后面跟一個錯誤類型,當代碼發(fā)生錯誤且錯誤類型符合的時候,就會執(zhí)行except中的代碼,不寫具體錯誤類型,表示接收任何類型的異常# 這里執(zhí)行異常處理的相關(guān)代碼,打印輸出等else:# 如果沒有異常則執(zhí)行else中的代碼finally:# 不管代碼是否異常,都會執(zhí)行,一般是資源的關(guān)閉和釋放
excep 異常/錯誤 as 別名,使用別名接收異常對象的錯誤信息。
如何捕獲多個異常?
1.寫出多行except 異常/錯誤,指定捕獲多個不同類型的異常。2.使用?except (異常1,異常2..),使用元組,在一行中捕獲多個不同類型的異常。
異常捕獲示例代碼:
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個字符")except Exception as err:print(err)
自定義異常
系統(tǒng)的自帶的異常只要觸發(fā)就會自動拋出,有時候,用戶自己決定什么時候拋出,并且給異常加上一些附加信息,這時候就可以使用自定義異常。
示例代碼:
# 自定義異常類,創(chuàng)建一個類繼承Exceptionclass MyError(Exception):passdef add(a, b):# a小于0,拋出異常if a < 0:raise MyError('自定義的異常')return a + bprint(add(-1, 5))
異常定義好之后,與內(nèi)置類的用法一樣,在需要的時候raise出來就可以了。
常見的使用異常的場景
?網(wǎng)絡(luò)請求相關(guān),比如網(wǎng)絡(luò)超時、連接異常等。?資源訪問相關(guān),比如文件的權(quán)限問題、文件的路徑、文件是否存在等。?代碼邏輯相關(guān),比如越界訪問、KeyError 等。
Python標準異常
異常名稱 | 描述 |
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 | 導入模塊/對象失敗 |
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 | 用戶代碼生成的警告 |
推薦閱讀

