Python 如何調(diào)試程序崩潰錯誤
問題
你的程序崩潰后該怎樣去調(diào)試它?
解決方案
如果你的程序因為某個異常而崩潰,運行 python3 -i someprogram.py
可執(zhí)行簡單的調(diào)試。 -i 選項可讓程序結(jié)束后打開一個交互式shell。 然后你就能查看環(huán)境,例如,假設你有下面的代碼:
# sample.py def func(n): return n + 10 func('Hello')
運行 python3 -i sample.py
會有類似如下的輸出:
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(比如在某個服務器上面), 通常可以捕獲異常后自己打印跟蹤信息。例如:
import traceback import sys try: func(arg) except: print('**** AN ERROR OCCURRED ****') traceback.print_exc(file=sys.stderr)
要是你的程序沒有崩潰,而只是產(chǎn)生了一些你看不懂的結(jié)果, 你在感興趣的地方插入一下 print()
語句也是個不錯的選擇。 不過,要是你打算這樣做,有一些小技巧可以幫助你。 首先,traceback.print_stack()
函數(shù)會你程序運行到那個點的時候創(chuàng)建一個跟蹤棧。例如:
>>> 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()
在任何地方手動的啟動調(diào)試器:
import pdb def func(arg): ... pdb.set_trace() ...
當程序比較大而你想調(diào)試控制流程以及函數(shù)參數(shù)的時候這個就比較有用了。 例如,一旦調(diào)試器開始運行,你就能夠使用 print 來觀測變量值或敲擊某個命令比如 w 來獲取追蹤信息。
討論
不要將調(diào)試弄的過于復雜化。一些簡單的錯誤只需要觀察程序堆棧信息就能知道了, 實際的錯誤一般是堆棧的最后一行。 你在開發(fā)的時候,也可以在你需要調(diào)試的地方插入一下 print()
函數(shù)來診斷信息(只需要最后發(fā)布的時候刪除這些打印語句即可)。
調(diào)試器的一個常見用法是觀測某個已經(jīng)崩潰的函數(shù)中的變量。 知道怎樣在函數(shù)崩潰后進入調(diào)試器是一個很有用的技能。
當你想解剖一個非常復雜的程序,底層的控制邏輯你不是很清楚的時候, 插入 pdb.set_trace()
這樣的語句就很有用了。
實際上,程序會一直運行到碰到 set_trace()
語句位置,然后立馬進入調(diào)試器。 然后你就可以做更多的事了。
如果你使用IDE來做Python開發(fā),通常IDE都會提供自己的調(diào)試器來替代pdb。 更多這方面的信息可以參考你使用的IDE手冊。
以上就是Python 如何調(diào)試程序崩潰錯誤的詳細內(nèi)容,更多關于Python調(diào)試程序崩潰錯誤的資料請關注腳本之家其它相關文章!
- Python 程序報錯崩潰后如何倒回到崩潰的位置(推薦)
- jupyter notebook 使用過程中python莫名崩潰的原因及解決方式
- python實現(xiàn)監(jiān)控某個服務 服務崩潰即發(fā)送郵件報告
- 解決python多線程報錯:AttributeError: Can''t pickle local object問題
- Python3下錯誤AttributeError: ‘dict’ object has no attribute’iteritems‘的分析與解決
- python錯誤:AttributeError: ''module'' object has no attribute ''setdefaultencoding''問題的解決方法
- Python進程崩潰AttributeError異常問題解決
相關文章
Python爬蟲教程之利用正則表達式匹配網(wǎng)頁內(nèi)容
這篇文章主要給大家介紹了關于Python爬蟲教程之利用正則表達式匹配網(wǎng)頁內(nèi)容的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12Python+Selenium實現(xiàn)瀏覽器標簽頁的切換
在實際工作中,我們經(jīng)常會遇到頁面切換的情況。就比如當點擊了某個功能的按鈕后,瀏覽器出現(xiàn)了新的標簽頁,需要在這些標簽頁之間進行切換。本文將利用Selenium實現(xiàn)這一功能,需要的可以參考一下2022-06-06python中找出numpy array數(shù)組的最值及其索引方法
下面小編就為大家分享一篇python中找出numpy array數(shù)組的最值及其索引方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04