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