【小白福利、快速入門Python】之異常處理

歡迎大家關(guān)注公眾號【哈希大數(shù)據(jù)】
python常見異常的介紹
python程序在運(yùn)行過程中可能會因?yàn)檎Z法錯誤、邏輯錯誤或外部異常(網(wǎng)絡(luò)中斷、空間不足、鍵盤操作)而導(dǎo)致程序終止退出。而且這些問題的出現(xiàn)往往是不可避免的。每一個較為成型的健壯的程序都是經(jīng)過不斷測試發(fā)現(xiàn)錯誤、調(diào)試錯誤、處理錯誤而逐漸完善。因此python中也內(nèi)置了較為完整的異常處理機(jī)制,來幫助程序開發(fā)人員更好的處理不同的程序問題。常見異常分類和實(shí)例如下:
NameError 使用的變量不存在

image

AttributionError對象屬性不存在,或者屬性名不對所造成

image

FileNotFoundError 讀取文件失敗,是因?yàn)槲募谥付ㄎ恢貌淮嬖?/p>

image

ModuleNotFoundError 模塊導(dǎo)入失敗 模塊名書寫不對

image

IndentationError代碼對齊方式不對,代碼書寫縮進(jìn)不正確

image

IndexError列表下標(biāo)超出索引

image

keyErroy字典不存在某個鍵

image

KeyboardInterrupt 用戶中斷操作,用戶使用鍵盤輸入了ctrl+c

image

SyntaxError 代碼的邏輯語法不對,python3中的輸出函數(shù)必須用()包裹輸出內(nèi)容

image

TypeError 傳入的對象類型不符合要求

image

ValueError 傳入的對象的值的數(shù)據(jù)類型也要求不符合

image

除了這些常見的異常之外,還有一些其他異常,在實(shí)際遇到時可以根據(jù)異常提示進(jìn)行調(diào)整和修改。

自定義拋出異常

python內(nèi)置的這個異常處理機(jī)制,可以幫助我們很快了解出錯的信息,而且我們也可以借助print(輸出語句)或assert(斷言機(jī)制)【assert 表達(dá)式,表達(dá)式不為真時輸出異?!空页龀鲥e的位置。促使我們有針對性的修正一些顯而易見的程序錯誤。

除此以外,在編寫特定功能模塊時,該模塊有些地方也會常常出現(xiàn)問題,但是在現(xiàn)有的機(jī)制中沒有合適的錯誤提示,當(dāng)別人導(dǎo)入使用該模塊可能不太能輕易找出這個異常,因此我們自己在編寫程序的過程中也可以自定義一些異常情況,并將其拋出,讓使用可以很方便的發(fā)現(xiàn)問題,解決問題。

如果是python中不存在的異常,需要先提前聲明對應(yīng)異常的類,不然會提示名稱異常的錯誤。在程序中將容易出問題的地方使用raise語句拋出進(jìn)行提示。自定義的錯誤拋出可以使得自己輸出的相關(guān)功能模塊更易復(fù)用,這種自定義拋出的異常必須是一個異常的實(shí)例或者是異常的類(也就是 Exception 的子類)。我們來看一個自定義的拋出異常實(shí)例:

#!/usr/bin/python# 
-*- coding: utf-8 -*-class MyError(TypeError): #定義異常的類 
pass #代碼占位不執(zhí)行任何操作def my_abs(x): #實(shí)現(xiàn)求絕對值的函數(shù)(要求輸入的必須是整型或者浮點(diǎn)型)
 if not isinstance(x, (int, float)): raise MyError('bad input type') #拋出異常
 if x >= 0: 
return x 
else: return -x
if __name__ == '__main__': print(my_abs(0)) print(my_abs('a'))

輸出結(jié)果

"D:\anaconda python\python3.6.exe" D:/vernacular/coding_ziyi/Error.py
Traceback (most recent call last):0
File"D:/vernacular/coding_ziyi/Error.py", line 16, in <module>

print(my_abs('a'))*
File"D:/vernacular/coding_ziyi/Error.py", line 9, in my_abs*
raise MyError('bad input type')*
main.MyError: bad input type*
Process finished with exit code*

和python的bug say googbye

python程序在運(yùn)行過程中,是按照主程序編寫順序依次執(zhí)行每條語句,如果運(yùn)行過程中在某條語句處檢測到錯誤,則會立即終止程序運(yùn)行,接下來的程序即使無錯也無法再正常運(yùn)行。為了跳過某些非人為因素導(dǎo)致的錯誤或者異常,或者比如在爬取網(wǎng)絡(luò)數(shù)據(jù)時,不同網(wǎng)頁的變量定義的不同可能會出現(xiàn)我們在獲取數(shù)據(jù)時所對應(yīng)的對象類型報(bào)錯的情況。會希望跳過一些特殊的網(wǎng)站,而去獲取其他類型符合要求的網(wǎng)站。這時需要借助python的處理異常的功能來實(shí)現(xiàn)。跳過可以直接忽略的那些報(bào)錯內(nèi)容。

image.png

注意點(diǎn):

1、 在異常處理機(jī)制中,只會輸出一個except捕捉的異常內(nèi)容。一旦捕獲一個異常內(nèi)容異常處理機(jī)制中后續(xù)的代碼將不會再執(zhí)行。直接跳到finally語句或接下來的程序塊。

2、 finally程序塊無論之前是否捕捉到異常都會被執(zhí)行過程,如果之前的except未捕捉到異常,經(jīng)過finally處理后會中斷程序并且提示相應(yīng)的異常內(nèi)容。若之前程序正常執(zhí)行或被except捕捉到異常,則之后程序仍正常執(zhí)行。

3、 else程序塊,只有在之前程序沒有任何異常被捕獲的的情況下才會執(zhí)行。

4、 try-except機(jī)制可以跨越多層次調(diào)用處理。只要在合適的層次處理異常捕獲即可。如在主函數(shù)中捕獲其他函數(shù)模塊的異常信息,而不需要再在其他函數(shù)本身捕獲異常。

5、 異常輸出結(jié)果也是跨層次進(jìn)行提示 ,從最新發(fā)現(xiàn)錯位的位置尋根溯源,最終幫開發(fā)者找出最核心的出錯原因。

python異常小結(jié)

1、本次主要介紹了python程序中常見的一些異常,以便更好的了解報(bào)錯內(nèi)容。

2、對于拋出異常方式可以直接通過print()或assert()方法定位異?;蛘呤峭ㄟ^自定義方式進(jìn)行提示。

3、靈活使用try-except檢測和處理異常,可以根據(jù)捕獲的異常信息確定異常原因,了解異常原因,而不影響后續(xù)程序的正常執(zhí)行(非人為因素導(dǎo)致的)。

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

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

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