Python學習 Day 12 調試 斷言 logging pdb pdb.set_trace

來源:互聯網
上載者:User

標籤:

調試

第一種方法簡單直接粗暴有效,就是用print把可能有問題的變數列印出來看看:

>>> def foo(s):n= int(s)print ‘>>> n = %d‘ % nreturn 10 / n>>> def main():foo(‘0‘)>>> main()>>> n = 0Traceback (most recent call last):File "<pyshell#25>", line 1, in <module>main()File "<pyshell#24>", line 2, in mainfoo(‘0‘)File "<pyshell#22>", line 4, in fooreturn 10 / nZeroDivisionError: integer division ormodulo by zero

  

斷言

凡是用print來輔助查看的地方,都可以用斷言(assert)來替代:

>>> def foo(s):n=int(s)assertn!=0,‘n is zero‘return10/n>>> def main():foo(‘0‘)>>> main()Traceback (most recent call last):File "<pyshell#37>", line 1, in <module>main()File "<pyshell#36>", line 2, in mainfoo(‘0‘)File "<pyshell#32>", line 3, in fooassert n!=0,‘n is zero‘AssertionError: n is zero

  

logging

把print替換為logging是第3種方式,和assert比,logging不會拋出錯誤,而且可以輸出到檔案:

>>> import logging>>>logging.basicConfig(level=logging.INFO)>>> s=‘0‘>>> n=int(s)>>> logging.info(‘n=%d‘ % n)>>> print 10/n Traceback (most recent call last):File "<pyshell#48>", line 1, in <module>print 10/nZeroDivisionError: integer division ormodulo by zero

  

pdb

第4種方式是啟動Python的調試器pdb,讓程式以單步方式運行,可以隨時查看運行狀態。

# err.pys = ‘0‘n = int(s)print 10 / n$ python -m pdb err.py> /Users/michael/Github/sicp/err.py(2)<module>()-> s = ‘0‘

  

以參數-m pdb啟動後,pdb定位到下一步要執行的代碼-> s = ‘0‘。輸入命令l來查看代碼:

 

(Pdb) l

1 # err.py

2 -> s = ‘0‘

3 n = int(s)

4 print 10 / n

[EOF]

輸入命令n可以逐步執行代碼:

 

(Pdb) n

>/Users/michael/Github/sicp/err.py(3)<module>()

-> n = int(s)

(Pdb) n

>/Users/michael/Github/sicp/err.py(4)<module>()

-> print 10 / n

任何時候都可以輸入命令p 變數名來查看變數:

 

(Pdb) p s

‘0‘

(Pdb) p n

0

輸入命令q結束調試,退出程式:

 

(Pdb) n

ZeroDivisionError: ‘integer division ormodulo by zero‘

>/Users/michael/Github/sicp/err.py(4)<module>()

-> print 10 / n

(Pdb) q

Try

這種通過pdb在命令列調試的方法理論上是萬能的,但實在是太麻煩

pdb.set_trace()

這個方法也是用pdb,但是不需要逐步執行,我們只需要import pdb,然後,在可能出錯的地方放一個pdb.set_trace(),就可以設定一個斷點:

# err.py
import pdb

s = ‘0‘
n = int(s)
pdb.set_trace() # 運行到這裡會自動暫停
print10 / n

運行代碼,程式會自動在pdb.set_trace()暫停並進入pdb調試環境,可以用命令p查看變數,或者用命令c繼續運行:

$ python err.py

>/Users/michael/Github/sicp/err.py(7)<module>()

-> print 10 / n

(Pdb) p n

0

(Pdb) c

Traceback (most recent call last):

File "err.py", line 7, in <module>

print 10 / n

ZeroDivisionError: integer division ormodulo by zero

這個方式比直接啟動pdb單步調試效率要高很多,但也高不到哪去。

Python學習 Day 12 調試 斷言 logging pdb pdb.set_trace

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.