本篇內(nèi)容主要講解“分析Python的錯誤,調(diào)試和測試方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“分析Python的錯誤,調(diào)試和測試方法”吧!
成都創(chuàng)新互聯(lián)長期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為湞江企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都做網(wǎng)站,湞江網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。錯誤處理
在預(yù)防程序發(fā)生運行錯誤的時候,可以預(yù)先設(shè)置返回一個錯誤代碼,然后在執(zhí)行程序的時候,就會知道程序是否正確。
用錯誤碼來表示是否出錯有時候也十分的不方便,因為函數(shù)本身應(yīng)該返回的正常結(jié)果和錯誤碼混在一起,會導(dǎo)致必須用大量的代碼去判斷代碼是否出錯:
def foo():
r = some_function()
if r == (-1):
return -1
return r
def bar():
r = foo()
if r==(-1):
print('Error')
else:
pass
一旦發(fā)生錯誤,還需要各個函數(shù)之間互相傳遞,用起來不方便,所以try…except…finally就被廣泛的用于試驗錯誤。
try
下面這個例子可以讓我們了解try的使用方法:
>>> try:
print("try...")
r = 10 / 0
print("result:",r)
except ZeroDivisionError as e:
print("except:",e)
finally:
print("Finally")
try...
except: division by zero
Finally
如果執(zhí)行出錯,則后續(xù)代碼不會繼續(xù)執(zhí)行,而是直接跳轉(zhuǎn)至錯誤處理代碼,即except語句塊,執(zhí)行完except后,如果有finally語句塊,則執(zhí)行finally語句塊,至此,執(zhí)行完畢。
如果將上面的0改成5,則不會報錯,正常運行。
>>> try:
print("try...")
r = 10 / 5
print("result:",r)
except ZeroDivisionError as e:
print("except:",e)
finally:
print("Finally")
try...
result: 2.0
Finally
可以看出不再執(zhí)行except語句,只要一個程序中有finally語句,他肯定會被執(zhí)行。
int()函數(shù)可能會拋出ValueError,所以我們用一個except捕獲ValueError,用另一個except捕獲ZeroDivisionError。此外,如果沒有錯誤發(fā)生,可以在except語句塊后面加一個else,當(dāng)沒有錯誤發(fā)生時,會自動執(zhí)行else語句:
try:
print('try...')
r = 10 / int('5')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
else:
print('no error!')
finally:
print('finally...')
print('END')
Python的錯誤其實也是一種類,所有的錯誤類型都繼承自BaseException,所以在使用except不但捕獲該類型的錯誤,還把其子類也“一網(wǎng)打盡”:
try:
foo()
except ValueError as e:
print('ValueError')
except UnicodeError as e:
print('UnicodeError')
第二個except永遠也捕獲不到UnicodeError,因為UnicodeError是ValueError的子類,如果有,也被第一個except給捕獲了。
常見錯誤及其關(guān)系
不需要在每個可能出錯的地方去捕獲錯誤,只要在合適的層次去捕獲錯誤就可以了。
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
print('Error:', e)
finally:
print('finally...')
調(diào)用棧
如果錯誤沒有被捕獲,它就會一直往上拋,最后被Python解釋器捕獲,打印一個錯誤信息,然后程序退出。下面這個例子可以很好地展示這種操作:
def foo(s):鄭州婦科醫(yī)院哪家好 http://www.120zzzy.com/
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
main()
運行顯示結(jié)果:
Traceback (most recent call last):
File "F:/python文件/tiaoshi/__init__.py", line 10, in
main()
File "F:/python文件/tiaoshi/__init__.py", line 8, in main
bar('0')
File "F:/python文件/tiaoshi/__init__.py", line 5, in bar
return foo(s) * 2
File "F:/python文件/tiaoshi/__init__.py", line 2, in foo
return 10 / int(s)
ZeroDivisionError: division by zero
下面我們就來解讀一下這個輸出的結(jié)果,首先第一句:
Traceback (most recent call last):
告訴我們這是錯誤的跟蹤信息。
File “F:/python文件/tiaoshi/init.py”, line 10, in <\module>
main()
代碼中第10行調(diào)用main函數(shù)出錯,原因是第8行.
File “F:/python文件/tiaoshi/init.py”, line 8, in main
bar(‘0’)
代碼中第8行調(diào)用bar函數(shù)出錯,原因是第5行.
File “F:/python文件/tiaoshi/init.py”, line 5, in bar
return foo(s) * 2
代碼中第5行返回foo函數(shù)出錯,原因是return 10 / int(s)這個語句出錯了,這是錯誤產(chǎn)生的源頭,因為下面打印了:
ZeroDivisionError: integer division or modulo by zero
根據(jù)錯誤類型ZeroDivisionError,我們判斷,int(s)本身并沒有出錯,但是int(s)返回0,在計算10 / 0時出錯,至此,找到錯誤源頭。
標題出錯的時候,一定要分析錯誤的調(diào)用棧信息,才能定位錯誤的位置。
記錄錯誤
如果不捕獲錯誤,自然可以讓Python解釋器來打印出錯誤堆棧,但程序也被結(jié)束了。既然我們能捕獲錯誤,就可以把錯誤堆棧打印出來,然后分析錯誤原因,同時,讓程序繼續(xù)執(zhí)行下去。Python內(nèi)置的logging模塊可以非常容易地記錄錯誤信息:
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
輸出結(jié)果:
END
ERROR:root:division by zero
Traceback (most recent call last):
File "F:/python文件/tiaoshi/__init__.py", line 14, in main
bar('0')
File "F:/python文件/tiaoshi/__init__.py", line 9, in bar
return foo(s) * 2
File "F:/python文件/tiaoshi/__init__.py", line 5, in foo
return 10 / int(s)
ZeroDivisionError: division by zero
Python內(nèi)置的try…except…finally用來處理錯誤十分方便。出錯時,會分析錯誤信息并定位錯誤發(fā)生的代碼位置才是最關(guān)鍵的。
程序也可以主動拋出錯誤,讓調(diào)用者來處理相應(yīng)的錯誤。但是,應(yīng)該在文檔中寫清楚可能會拋出哪些錯誤,以及錯誤產(chǎn)生的原因。
到此,相信大家對“分析Python的錯誤,調(diào)試和測試方法”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
網(wǎng)站名稱:分析Python的錯誤,調(diào)試和測試方法-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://www.rwnh.cn/article16/dcopgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、云服務(wù)器、定制開發(fā)、靜態(tài)網(wǎng)站、標簽優(yōu)化、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容