1. 程式人生 > 程式設計 >Python 如何除錯程式崩潰錯誤

Python 如何除錯程式崩潰錯誤

問題

你的程式崩潰後該怎樣去除錯它?

解決方案

如果你的程式因為某個異常而崩潰,執行 python3 -i someprogram.py 可執行簡單的除錯。 -i 選項可讓程式結束後開啟一個互動式shell。 然後你就能檢視環境,例如,假設你有下面的程式碼:

# 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的偵錯程式。例如:

>>> 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 traceback
import sys

try:
  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 5,in sample
>>>

另外,你還可以像下面這樣使用 pdb.set_trace() 在任何地方手動的啟動偵錯程式:

import pdb

def func(arg):
  ...
  pdb.set_trace()
  ...

當程式比較大而你想除錯控制流程以及函式引數的時候這個就比較有用了。 例如,一旦偵錯程式開始執行,你就能夠使用 print 來觀測變數值或敲擊某個命令比如 w 來獲取追蹤資訊。

討論

不要將除錯弄的過於複雜化。一些簡單的錯誤只需要觀察程式堆疊資訊就能知道了, 實際的錯誤一般是堆疊的最後一行。 你在開發的時候,也可以在你需要除錯的地方插入一下 print() 函式來診斷資訊(只需要最後釋出的時候刪除這些列印語句即可)。

偵錯程式的一個常見用法是觀測某個已經崩潰的函式中的變數。 知道怎樣在函式崩潰後進入偵錯程式是一個很有用的技能。

當你想解剖一個非常複雜的程式,底層的控制邏輯你不是很清楚的時候, 插入 pdb.set_trace() 這樣的語句就很有用了。

實際上,程式會一直執行到碰到 set_trace() 語句位置,然後立馬進入偵錯程式。 然後你就可以做更多的事了。

如果你使用IDE來做Python開發,通常IDE都會提供自己的偵錯程式來替代pdb。 更多這方面的資訊可以參考你使用的IDE手冊。

以上就是Python 如何除錯程式崩潰錯誤的詳細內容,更多關於Python除錯程式崩潰錯誤的資料請關注我們其它相關文章!