標籤:函數參數 blank section pre 文章 std shel 常見 get
14.12 調試基本的程式崩潰錯誤?問題?
你的程式崩潰後該怎樣去調試它?
解決方案?
如果你的程式因為某個異常而崩潰,運行 python3 -i someprogram.py 可執行簡單的調試。
-i 選項可讓程式結束後開啟一個互動式shell。
然後你就能查看環境,例如,假設你有下面的代碼:
# sample.pydef func(n): return n + 10func(‘Hello‘)
運行 python3 -i sample.py 會有類似如下的輸出:
bash % python3 -i sample.pyTraceback (most recent call last): File "sample.py", line 6, in <module> func(‘Hello‘) File "sample.py", line 4, in func return n + 10TypeError: Can‘t convert ‘int‘ object to str implicitly>>> func(10)20>>>
如果你看不到上面這樣的,可以在程式崩潰後開啟Python的調試器。例如:
>>> 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>>>
如果你的代碼所在的環境很難擷取互動shell(比如在某個伺服器上面),
通常可以捕獲異常後自己列印跟蹤資訊。例如:
import tracebackimport systry: func(arg)except: print(‘**** AN ERROR OCCURRED ****‘) traceback.print_exc(file=sys.stderr)
要是你的程式沒有崩潰,而只是產生了一些你看不懂的結果,
你在感興趣的地方插入一下 print() 語句也是個不錯的選擇。
不過,要是你打算這樣做,有一些小技巧可以協助你。
首先,traceback.print_stack() 函數會你程式運行到那個點的時候建立一個跟蹤棧。例如:
>>> 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() 在任何地方手動的啟動調試器:
import pdbdef func(arg): ... pdb.set_trace() ...
當程式比較大而你想調試控制流程程以及函數參數的時候這個就比較有用了。
例如,一旦調試器開始運行,你就能夠使用 print 來觀測變數值或敲擊某個命令比如 w 來擷取追蹤資訊。
討論?
不要將調試弄的過於複雜化。一些簡單的錯誤只需要觀察程式堆棧資訊就能知道了,
實際的錯誤一般是堆棧的最後一行。
你在開發的時候,也可以在你需要調試的地方插入一下 print()
函數來診斷資訊(只需要最後發布的時候刪除這些列印語句即可)。
調試器的一個常見用法是觀測某個已經崩潰的函數中的變數。
知道怎樣在函數崩潰後進入調試器是一個很有用的技能。
當你想解剖一個非常複雜的程式,底層的控制邏輯你不是很清楚的時候,
插入 pdb.set_trace() 這樣的語句就很有用了。
實際上,程式會一直運行到碰到 set_trace() 語句位置,然後立馬進入調試器。
然後你就可以做更多的事了。
如果你使用IDE來做Python開發,通常IDE都會提供自己的調試器來替代pdb。
更多這方面的資訊可以參考你使用的IDE手冊。
艾伯特(http://www.aibbt.com/)國內第一家人工智慧門戶
Python Cookbook(第3版)中文版:14.12 調試基本的程式崩潰錯誤