? ? ? ?寫python的人一般都不太看重調試配名, 因為這是一門解釋性語言啤咽, 在哪出錯會立馬在解釋器里提示出來。但是渠脉, 以上觀點只適用于小的腳本或者項目宇整。因為我在接觸目前項目之前, 我一直都是這么做的芋膘。
? ? ? ? 對于一個大的項目來說鳞青, 調試就不能這么做了, 這種大項目通常都是多進程或者多線程为朋, 普通的調試基本沒辦法臂拓。通常會通過記錄日志來調試, 記錄日志潜腻。埃儿。這里就是我想說得一個坑。正常的項目里面都會有容錯處理融涣, 也就是各種try...except童番, 然后把拋出的異常寫到日志精钮, 出錯的時候就可以通過看錯誤日志去定位信息。 但是, 拋出的異常通常只是一句話剃斧, 無法得到具體的錯誤代碼行轨香, 這在一個模塊比較多的項目里簡直就是噩夢, 你可能要花費很多時間去定位錯誤所在地方幼东, 效率極其低下臂容。 腫么辦呢, python里面有一個模塊叫traceback根蟹, 這個模塊是干嘛的呢脓杉, 請看官方解釋:
This module provides a standard interface to extract, format and print stack traces of Python programs. It exactly mimics the behavior of the Python interpreter when it prints a stack trace. This is useful when you want to print stack traces under program control, such as in a “wrapper” around the interpreter.
? ? ? ? ?也就是說, 這個模塊就像一個縮小版的解釋器一樣简逮, 可以跟蹤代碼運行棧球散。 簡單來說, 可以看到代碼詳細出錯信息散庶, 包括在哪出錯蕉堰。怎么用呢, 就說一種用法悲龟, 我覺得夠用了:
import traceback
try:1/0
except Exception as e:traceback.print_exc(file=open('/tmp/error', 'wb'))
這樣程序在拋出異常后屋讶, 就會將出錯信息寫到'/tmp/error'這個文件中, just enjoy it!
另外要說的一種方法是logging模塊中用到的方法须教。
對于大型項目而言皿渗,用logging模塊調試是一種更好的方法,日志集中管理没卸。
要使用日志羹奉,首先要聲明一個logger,具體怎么聲明這里不再贅述约计,參見python官方文檔或者google诀拭。
效果和traceback一樣,代碼如下:
try:1/0
except Exception as e:logger.exception(e)