Python Cookbook(第3版)中文版:14.12 調試基本的程式崩潰錯誤

來源:互聯網
上載者:User

標籤:函數參數   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 調試基本的程式崩潰錯誤

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.