四、錯(cuò)誤匙头、調(diào)試漫谷、測(cè)試

1.錯(cuò)誤處理


try

try使用
結(jié)果

try內(nèi)的代碼一旦出錯(cuò)就會(huì)跳轉(zhuǎn)到except語(yǔ)句塊并且在出錯(cuò)代碼處停止繼續(xù)執(zhí)行,然后在執(zhí)行完except后蹂析,如果有finally語(yǔ)句塊舔示,則執(zhí)行finally語(yǔ)句塊。

那么如果try不出錯(cuò)那电抚?

不出錯(cuò)時(shí)
結(jié)果

執(zhí)行完try語(yǔ)句塊后惕稻,不在執(zhí)行except語(yǔ)句塊的內(nèi)容,但是還會(huì)執(zhí)行finally語(yǔ)句塊蝙叛。

因?yàn)殄e(cuò)誤有很多種俺祠,所以就會(huì)有多個(gè)except來(lái)捕獲不同類(lèi)型的錯(cuò)誤苦蒿。

多種異常
捕獲到其他異常

注意:因?yàn)殄e(cuò)誤類(lèi)型也是類(lèi)有繼承關(guān)系茵烈,所以就有以下例子發(fā)生某残。

繼承關(guān)系

第二個(gè)except永遠(yuǎn)也捕獲不到UnicodeError鸡挠,因?yàn)閁nicodeError是ValueError的子類(lèi)十拣,如果有舌厨,也被第一個(gè)except給捕獲了刨疼。

常見(jiàn)的錯(cuò)誤類(lèi)型和繼承關(guān)系查看地址如下:

https://docs.python.org/3/library/exceptions.html#exception-hierarchy

跨越多層調(diào)用

比如函數(shù)main()調(diào)用foo()专缠,foo()調(diào)用bar()狰挡,結(jié)果bar()出錯(cuò)了捂龄,這時(shí)释涛,只要main()捕獲到了。

跨越多層調(diào)用

調(diào)用棧

如果錯(cuò)誤沒(méi)有被捕獲倦沧,就會(huì)入棧被捕獲并且被打印出來(lái)唇撬。

錯(cuò)誤沒(méi)有被捕獲
打印錯(cuò)誤信息

我們由上往下看打印的錯(cuò)誤信息。從20行的main()方法的執(zhí)行開(kāi)始追本溯源展融,按照邏輯最終找到了15行出的錯(cuò)誤窖认。

15行出的具體錯(cuò)誤

注意:因此出錯(cuò)的時(shí)候一定要仔細(xì)推敲打印的錯(cuò)誤信息

記錄錯(cuò)誤

利用Python內(nèi)置的logging模塊可以非常容易地記錄錯(cuò)誤信息并且打印完錯(cuò)誤信息后會(huì)繼續(xù)執(zhí)行,最后正常退出告希。

logging模塊
打印錯(cuò)誤并正常執(zhí)行

通過(guò)配置扑浸,logging還可以把錯(cuò)誤記錄到日志文件里,方便事后排查燕偶。

自定義一個(gè)類(lèi)接收拋出錯(cuò)誤


自定義

根據(jù)需要喝噪,可以定義一個(gè)錯(cuò)誤的class,選擇好繼承關(guān)系指么,然后酝惧,用raise語(yǔ)句拋出一個(gè)錯(cuò)誤。

得出錯(cuò)誤結(jié)果

注意:盡量使用Python內(nèi)置的錯(cuò)誤類(lèi)型伯诬。

raise語(yǔ)句

raise語(yǔ)句如果不帶參數(shù)晚唇,就會(huì)把當(dāng)前錯(cuò)誤原樣拋出。

raise語(yǔ)句
結(jié)果

在打印一個(gè)ValueError!后盗似,又把錯(cuò)誤通過(guò)raise語(yǔ)句拋出去了的目的是:

捕獲錯(cuò)誤目的只是記錄一下哩陕,便于后續(xù)追蹤。


2.調(diào)試


第一種方法把可能有問(wèn)題的變量打印出來(lái)桥言,但是壞處是將來(lái)還得刪掉它并且運(yùn)行結(jié)果也會(huì)包含很多垃圾信息萌踱。

用print()
結(jié)果

第二種方法凡是用print()來(lái)輔助查看的地方,都可以用斷言(assert)來(lái)替代:


(這里代碼出了問(wèn)題号阿,例子之后補(bǔ)上并鸵。)


第三種方式是把print()替換為logging,和assert比扔涧,logging不會(huì)拋出錯(cuò)誤园担,而且可以輸出到文件。

logging
結(jié)果

它允許你指定記錄信息的級(jí)別枯夜,有debug弯汰,info,warning湖雹,error等幾個(gè)級(jí)別咏闪,當(dāng)我們指定level=INFO時(shí),logging.debug就不起作用了摔吏。同理鸽嫂,指定level=WARNING后纵装,debug和info就不起作用了。這樣一來(lái)据某,你可以放心地輸出不同級(jí)別的信息橡娄,也不用刪除,最后統(tǒng)一控制輸出哪個(gè)級(jí)別的信息癣籽。

第四種方式是啟動(dòng)Python的調(diào)試器pdb挽唉,讓程序以單步方式運(yùn)行,可以隨時(shí)查看運(yùn)行狀態(tài)筷狼。

出錯(cuò)的代碼
執(zhí)行的時(shí)候輸入?yún)?shù)-m pdb??
pdb使用

啟動(dòng)后瓶籽,pdb定位到下一步要執(zhí)行的代碼并且在此行代碼處會(huì)出現(xiàn)->符號(hào)。

l:查看代碼

n:只執(zhí)行一行的代碼

p 變量名:查看變量

q:結(jié)束調(diào)試

第五種方式桑逝,這個(gè)方法也是用pdb棘劣,但是不需要單步執(zhí)行俏让,我們只需要import pdb楞遏,然后,在可能出錯(cuò)的地方放一個(gè)pdb.set_trace()首昔,就可以設(shè)置一個(gè)斷點(diǎn)寡喝。

pdb.set_trace()
結(jié)果

程序會(huì)自動(dòng)在pdb.set_trace()暫停并進(jìn)入pdb調(diào)試環(huán)境,命令c會(huì)繼續(xù)運(yùn)行勒奇。

第六種方式是一個(gè)支持調(diào)試功能的IDE预鬓。

注意:logging才是最好用的調(diào)試工具


3.單元測(cè)試


單元測(cè)試是用來(lái)對(duì)一個(gè)模塊、一個(gè)函數(shù)或者一個(gè)類(lèi)來(lái)進(jìn)行正確性檢驗(yàn)的測(cè)試工作赊颠。




4.文檔測(cè)試


代碼與其他說(shuō)明可以寫(xiě)在注釋中格二,然后,由一些工具來(lái)自動(dòng)生成文檔竣蹦。

只要這些代碼本身就可以直接運(yùn)行顶猜,那么就可以自動(dòng)執(zhí)行寫(xiě)在注釋中的這些代碼。

這就是Python內(nèi)置的“文檔測(cè)試”(doctest)模塊痘括,他可以直接提取注釋中的代碼并執(zhí)行測(cè)試长窄。

通過(guò)'''來(lái)把“文檔測(cè)試”(doctest)模塊的內(nèi)容包圍起來(lái)即可。

doctest嚴(yán)格按照Python交互式命令行的輸入和輸出來(lái)判斷測(cè)試結(jié)果是否正確纲菌。只有測(cè)試異常的時(shí)候挠日,可以用...表示中間一大段煩人的輸出。

“文檔測(cè)試”(doctest)模塊??
結(jié)果

什么輸出也沒(méi)有翰舌。這說(shuō)明我們編寫(xiě)的doctest運(yùn)行都是正確的嚣潜。

如果程序有問(wèn)題的話(huà),再運(yùn)行就會(huì)報(bào)錯(cuò)椅贱!

當(dāng)模塊正常導(dǎo)入時(shí)懂算,doctest不會(huì)被執(zhí)行唉韭。只有在命令行直接運(yùn)行時(shí),才執(zhí)行doctest犯犁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末属愤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酸役,更是在濱河造成了極大的恐慌住诸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涣澡,死亡現(xiàn)場(chǎng)離奇詭異贱呐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)入桂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)奄薇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人抗愁,你說(shuō)我怎么就攤上這事馁蒂。” “怎么了蜘腌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵沫屡,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我撮珠,道長(zhǎng)沮脖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任芯急,我火速辦了婚禮勺届,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娶耍。我一直安慰自己免姿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布伺绽。 她就那樣靜靜地躺著养泡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奈应。 梳的紋絲不亂的頭發(fā)上澜掩,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音杖挣,去河邊找鬼肩榕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的株汉。 我是一名探鬼主播筐乳,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乔妈!你這毒婦竟也來(lái)了蝙云?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤路召,失蹤者是張志新(化名)和其女友劉穎勃刨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體股淡,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡身隐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唯灵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贾铝。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖埠帕,靈堂內(nèi)的尸體忽然破棺而出垢揩,到底是詐尸還是另有隱情,我是刑警寧澤搞监,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布水孩,位于F島的核電站镰矿,受9級(jí)特大地震影響琐驴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秤标,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一绝淡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苍姜,春花似錦牢酵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至垫释,卻和暖如春丝格,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棵譬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工显蝌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人订咸。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓曼尊,卻偏偏與公主長(zhǎng)得像酬诀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骆撇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容