先引入一個(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)步!