第九節除錯

2021-08-18 10:27:15 字數 2045 閱讀 5609

除錯

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

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

assert的意思是,表示式n != 0應該是true,否則,根據程式執行的邏輯,後面的**肯定會出錯。

如果斷言失敗,assert語句本身就會丟擲assertionerror

程式中如果到處充斥著assert,和print()相比也好不到哪去。不過,啟動python直譯器時可以用-o引數來關閉assert

logging

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

logging.info()就可以輸出一段文字。執行,發現除了zerodivisionerror,沒有任何資訊。怎麼回事?

別急,在import logging之後新增一行配置再試試:

這就是logging的好處,它允許你指定記錄資訊的級別,有debug,info,warning,error等幾個級別,當我們指定level=info時,logging.debug就不起作用了。同理,指定level=warning後,debug和info就不起作用了。這樣一來,你可以放心地輸出不同級別的資訊,也不用刪除,最後統一控制輸出哪個級別的資訊。

pdb第4種方式是啟動python的偵錯程式pdb,讓程式以單步方式執行,可以隨時檢視執行狀態。

$ python -m pdb err.py

(pdb) l

1     # err.py

2  -> s = '0'

3     n = int(s)

4     print(10 / n)

輸入命令n可以單步執行**:

(pdb) n

> /users/michael/github/learn-python3/samples/debug/err.py(3)()

-> n = int(s)

(pdb) n

> /users/michael/github/learn-python3/samples/debug/err.py(4)()

-> print(10 / n)

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

(pdb) p s

'0'(pdb) p n

0輸入命令q結束除錯,退出程式:

(pdb) q

這種通過pdb在命令列除錯的方法理論上是萬能的,但實在是太麻煩了,如果有一千行**,要執行到第999行得敲多少命令啊。

pdb.set_trace()

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

# err.py

import pdb

s = '0'

n = int(s)

pdb.set_trace() # 執行到這裡會自動暫停

print(10 / n)

執行**,程式會自動在pdb.set_trace()暫停並進入pdb除錯環境,可以用命令p檢視變數,或者用命令c繼續執行:

$ python err.py 

> /users/michael/github/learn-python3/samples/debug/err.py(7)()

-> print(10 / n)

(pdb) p n

0(pdb) c

traceback (most recent call last):

file "err.py", line 7, in

print(10 / n)

zerodivisionerror: division by zero

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

ide如果要比較爽地設定斷點、單步執行,就需要乙個支援除錯功能的ide。目前比較好的python ide有:

visual studio code:需要安裝python外掛程式。

pycharm:

另外,eclipse加上pydev外掛程式也可以除錯python程式

java筆記第九節

第九節 一 設計模式 相當於戰術 入格 看 可用性,美觀性 的由23種。二 架構模式 相當於戰略 目前只有兩種 1.b s 瀏覽器 伺服器,邏輯 堆放到伺服器上 方便公升級,修改,伺服器任務重 b s網頁上的內容是臨時從伺服器上下下來的 2.c s 客戶 伺服器,邏輯 堆放到客戶端上 不適合管理軟體...

第九節 開閉原則

1 開閉原則,對擴充套件是開放的,對修改是關閉的。2 復用,模組復用和系統復用,其中模組部分復用或將整個專案程式設計可復用的。3 內部模組化時,之中有不同的邏輯。將 分為業務邏輯層和資料儲存層,將 模組化成兩個層級。像 對選單的處理,選單功能實現為業務邏輯 像 選單資料儲存用鍊錶,也可以以後改為雜湊...

第九節 陣列

陣列是為了放多個資料的資料型別,陣列是引用資料型別,除了八種基本資料型別外其他資料都是引用資料型別。語法 有兩種方式 方式一 資料型別 變數名 推薦 例如 int array 方式二 資料型別 變數名 例如 int array 語法 有兩種方式 方式一 變數名 new 資料型別 陣列大小 方式二 變...