您好,登錄后才能下訂單哦!
這篇文章主要講解了Python調(diào)試程序崩潰錯(cuò)誤的方法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
問題
你的程序崩潰后該怎樣去調(diào)試它?
解決方案
如果你的程序因?yàn)槟硞€(gè)異常而崩潰,運(yùn)行 python3 -i someprogram.py 可執(zhí)行簡(jiǎn)單的調(diào)試。 -i 選項(xiàng)可讓程序結(jié)束后打開一個(gè)交互式shell。 然后你就能查看環(huán)境,例如,假設(shè)你有下面的代碼:
# sample.py def func(n): return n + 10 func('Hello')
運(yùn)行 python3 -i sample.py 會(huì)有類似如下的輸出:
bash % python3 -i sample.py Traceback (most recent call last): File "sample.py", line 6, in <module> func('Hello') File "sample.py", line 4, in func return n + 10 TypeError: Can't convert 'int' object to str implicitly >>> func(10) 20 >>>
如果你看不到上面這樣的,可以在程序崩潰后打開Python的調(diào)試器。例如:
>>> import pdb >>> pdb.pm() > sample.py(4)func() -> return n + 10 (Pdb) w sample.py(6)<module>() -> func('Hello') > sample.py(4)func() -> return n + 10 (Pdb) print n 'Hello' (Pdb) q >>>
如果你的代碼所在的環(huán)境很難獲取交互shell(比如在某個(gè)服務(wù)器上面), 通??梢圆东@異常后自己打印跟蹤信息。例如:
import traceback import sys try: func(arg) except: print('**** AN ERROR OCCURRED ****') traceback.print_exc(file=sys.stderr)
要是你的程序沒有崩潰,而只是產(chǎn)生了一些你看不懂的結(jié)果, 你在感興趣的地方插入一下 print() 語句也是個(gè)不錯(cuò)的選擇。 不過,要是你打算這樣做,有一些小技巧可以幫助你。 首先,traceback.print_stack() 函數(shù)會(huì)你程序運(yùn)行到那個(gè)點(diǎn)的時(shí)候創(chuàng)建一個(gè)跟蹤棧。例如:
>>> def sample(n): ... if n > 0: ... sample(n-1) ... else: ... traceback.print_stack(file=sys.stderr) ... >>> sample(5) File "<stdin>", line 1, in <module> File "<stdin>", line 3, in sample File "<stdin>", line 3, in sample File "<stdin>", line 3, in sample File "<stdin>", line 3, in sample File "<stdin>", line 3, in sample File "<stdin>", line 5, in sample >>>
另外,你還可以像下面這樣使用 pdb.set_trace() 在任何地方手動(dòng)的啟動(dòng)調(diào)試器:
import pdb def func(arg): ... pdb.set_trace() ...
當(dāng)程序比較大而你想調(diào)試控制流程以及函數(shù)參數(shù)的時(shí)候這個(gè)就比較有用了。 例如,一旦調(diào)試器開始運(yùn)行,你就能夠使用 print 來觀測(cè)變量值或敲擊某個(gè)命令比如 w 來獲取追蹤信息。
討論
不要將調(diào)試弄的過于復(fù)雜化。一些簡(jiǎn)單的錯(cuò)誤只需要觀察程序堆棧信息就能知道了, 實(shí)際的錯(cuò)誤一般是堆棧的最后一行。 你在開發(fā)的時(shí)候,也可以在你需要調(diào)試的地方插入一下 print() 函數(shù)來診斷信息(只需要最后發(fā)布的時(shí)候刪除這些打印語句即可)。
調(diào)試器的一個(gè)常見用法是觀測(cè)某個(gè)已經(jīng)崩潰的函數(shù)中的變量。 知道怎樣在函數(shù)崩潰后進(jìn)入調(diào)試器是一個(gè)很有用的技能。
當(dāng)你想解剖一個(gè)非常復(fù)雜的程序,底層的控制邏輯你不是很清楚的時(shí)候, 插入 pdb.set_trace() 這樣的語句就很有用了。
實(shí)際上,程序會(huì)一直運(yùn)行到碰到 set_trace() 語句位置,然后立馬進(jìn)入調(diào)試器。 然后你就可以做更多的事了。
如果你使用IDE來做Python開發(fā),通常IDE都會(huì)提供自己的調(diào)試器來替代pdb。 更多這方面的信息可以參考你使用的IDE手冊(cè)。
看完上述內(nèi)容,是不是對(duì)Python調(diào)試程序崩潰錯(cuò)誤的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。