代碼遇到異常怎么辦?不要慌,來(lái)看看這個(gè)!

先引入一個(gè)網(wǎng)上找的表格

異常名稱(chēng)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?描述

BaseException? ? ? ? ? ? ? ? ? ? ? ? ? ?所有異常的基類(lèi)

SystemExit? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 解釋器請(qǐng)求退出

KeyboardInterrupt? ? ? ? ? ? ? ? ? ? ? ?用戶(hù)中斷執(zhí)行(通常是輸入^C)

Exception? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?常規(guī)錯(cuò)誤的基類(lèi)

StopIteration? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 迭代器沒(méi)有更多的值

GeneratorExit? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 生成器(generator)發(fā)生異常來(lái)通知退出

StandardError? ? ? ? ? ? ? ? ? ? ? ? ? ? ?所有的內(nèi)建標(biāo)準(zhǔn)異常的基類(lèi)

ArithmeticError? ? ? ? ? ? ? ? ? ? ? ? ? ? 所有數(shù)值計(jì)算錯(cuò)誤的基類(lèi)

FloatingPointError? ? ? ? ? ? ? ? ? ? ? ? 浮點(diǎn)計(jì)算錯(cuò)誤

OverflowError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 數(shù)值運(yùn)算超出最大限制

ZeroDivisionError? ? ? ? ? ? ? ? ? ? ? ? ? 除(或取模)零 (所有數(shù)據(jù)類(lèi)型)

AssertionError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?斷言語(yǔ)句失敗

AttributeError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?對(duì)象沒(méi)有這個(gè)屬性

EOFError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 沒(méi)有內(nèi)建輸入,到達(dá)EOF 標(biāo)記

EnvironmentError? ? ? ? ? ? ? ? ? ? ? ? ? ?操作系統(tǒng)錯(cuò)誤的基類(lèi)

IOError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 輸入/輸出操作失敗

OSError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 操作系統(tǒng)錯(cuò)誤

WindowsError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?系統(tǒng)調(diào)用失敗

ImportError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 導(dǎo)入模塊/對(duì)象失敗

LookupError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 無(wú)效數(shù)據(jù)查詢(xún)的基類(lèi)

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)的方法

SyntaxErrorPython? ? ? ? ? ? ? ? ? ? ? ? 語(yǔ)法錯(cuò)誤

IndentationError? ? ? ? ? ? ? ? ? ? ? ? ? ? ?縮進(jìn)錯(cuò)誤

TabError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Tab 和空格混用

SystemError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一般的解釋器系統(tǒng)錯(cuò)誤

TypeError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?對(duì)類(lèi)型無(wú)效的操作

ValueError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 傳入無(wú)效的參數(shù)

UnicodeError? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Unicode 相關(guān)的錯(cuò)誤

UnicodeDecodeError? ? ? ? ? ? ? ? ? ? ?Unicode 解碼時(shí)的錯(cuò)誤

UnicodeEncodeError? ? ? ? ? ? ? ? ? ? ? ?Unicode 編碼時(shí)錯(cuò)誤

UnicodeTranslateError? ? ? ? ? ? ? ? ? ? ?Unicode 轉(zhuǎn)換時(shí)錯(cuò)誤

Warning? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?警告的基類(lèi)

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? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用戶(hù)代碼生成的警告

今天要說(shuō)的是,好多人在開(kāi)始學(xué)習(xí)編程的時(shí)候,都會(huì)遇到各種各樣的報(bào)錯(cuò),然而出現(xiàn)問(wèn)題后第一反應(yīng)就是,唉呀,我的代碼錯(cuò)了,怎么辦?去問(wèn)問(wèn)別人吧!(python群542110741) 這種想法是很可怕的,因?yàn)槟闾颖芰藛?wèn)題,如果你仔細(xì)分析后再去請(qǐng)教,那么下次遇到類(lèi)似問(wèn)題,就知道怎么去處理了,這樣才會(huì)有進(jìn)步!

好了,回歸主題

什么是異常?

通俗的說(shuō),異常就是錯(cuò)誤,當(dāng)我們寫(xiě)完代碼,運(yùn)行它的時(shí)候,如果python無(wú)法正常處理某一個(gè)或者一段代碼的時(shí)候就終止運(yùn)行并出現(xiàn)報(bào)錯(cuò)。

異常是一個(gè)對(duì)象(話說(shuō)python中所有的東西都可以認(rèn)為是對(duì)象。)

當(dāng)然如果你的代碼本身就是錯(cuò)的無(wú)法運(yùn)行,那么也就別說(shuō)出現(xiàn)什么異常了。。。

出現(xiàn)異常怎么處理

一般情況下,python會(huì)指明出現(xiàn)異常的種類(lèi)和位置,我們只需要修正相應(yīng)的地方就可以了!

比如這段代碼:

a =1

if a

? ? print(a)

很明顯的語(yǔ)法錯(cuò)誤,那么我們只需要按照提示在a后面加上冒號(hào)就行了!

還有一種情況下,出現(xiàn)了我們無(wú)法判斷的異常,比如做爬蟲(chóng)的時(shí)候,有時(shí)候抓不到內(nèi)容,代碼會(huì)返回空列表,然而我們依然取列表中的值就會(huì)報(bào)錯(cuò):IndexError: list index out of range,或者requests.get()獲取網(wǎng)頁(yè)內(nèi)容的時(shí)候,也可能會(huì)出現(xiàn)返回403的情況,這類(lèi)異常,我們可以用try/except語(yǔ)句來(lái)處理!

語(yǔ)法:

以下為簡(jiǎn)單的try....except...else的語(yǔ)法:

try:

<語(yǔ)句>#運(yùn)行代碼

except<名字>:

<語(yǔ)句>#如果在try部份引發(fā)了<名字>異常

except<名字>,<數(shù)據(jù)>:

<語(yǔ)句>#如果引發(fā)了<名字>異常,獲得附加的數(shù)據(jù)

else:

<語(yǔ)句>#如果沒(méi)有異常發(fā)生

try的工作原理是,當(dāng)開(kāi)始一個(gè)try語(yǔ)句后,python就在當(dāng)前程序的上下文中作標(biāo)記,這樣當(dāng)異常出現(xiàn)時(shí)就可以回到這里,try子句先執(zhí)行,接下來(lái)會(huì)發(fā)生什么依賴(lài)于執(zhí)行時(shí)是否出現(xiàn)異常。

如果當(dāng)try后的語(yǔ)句執(zhí)行時(shí)發(fā)生異常,python就跳回到try并執(zhí)行第一個(gè)匹配該異常的except子句,異常處理完畢,控制流就通過(guò)整個(gè)try語(yǔ)句(除非在處理異常時(shí)又引發(fā)新的異常)。

如果在try后的語(yǔ)句里發(fā)生了異常,卻沒(méi)有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結(jié)束程序,并打印缺省的出錯(cuò)信息)。

如果在try子句執(zhí)行時(shí)沒(méi)有發(fā)生異常,python將執(zhí)行else語(yǔ)句后的語(yǔ)句(如果有else的話),然后控制流通過(guò)整個(gè)try語(yǔ)句。

使用except而不帶任何異常類(lèi)型

你可以不帶任何異常類(lèi)型使用except,如下實(shí)例:

try:

正常的操作? ......................

except:

發(fā)生異常,執(zhí)行這塊代碼? ......................

else:

如果沒(méi)有異常執(zhí)行這塊代碼

使用except而帶多種異常類(lèi)型

你也可以使用相同的except語(yǔ)句來(lái)處理多個(gè)異常信息,如下所示:

try:? ??

正常的操作? ......................

except(Exception1[, Exception2[,...ExceptionN]]]):??

發(fā)生以上多個(gè)異常中的一個(gè),執(zhí)行這塊代碼? ......................

else:

? ? 如果沒(méi)有異常執(zhí)行這塊代碼

以上摘抄了一段內(nèi)容(小編很懶的),所有的教程都會(huì)有相關(guān)的內(nèi)容,大家看看就好

這里要說(shuō)的是,大家盡量不要使用try-except來(lái)捕獲所有的異常,因?yàn)檫@往往代表著我們不能通過(guò)異常去判斷哪里出現(xiàn)了問(wèn)題,因?yàn)槟愕拇a跳過(guò)了所有可能。

其實(shí),寫(xiě)代碼本身就是一個(gè)細(xì)活,不能隨心所欲的寫(xiě),它有本身的規(guī)則的,我們?cè)谟龅絾?wèn)題的時(shí)候,一定要去想辦法找到問(wèn)題,并解決它,這樣才會(huì)有進(jìn)步!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容