Python基礎(16):除錯是個技術活……
一,呼叫棧
定義:呼叫函式鏈。
用途:當出現錯誤時,分析呼叫棧可以定位出具體的錯誤位置。
示例:
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
main()
執行結果:
解讀:
File "E:/PycharmProjects/Python_file/write_blog/除錯.py", line 7, in <module>main()
執行main函式發生錯誤,錯誤位置,第七行
File "E:/PycharmProjects/Python_file/write_blog/除錯.py", line 6, in main bar('0')
main中呼叫bar函式發生錯誤,錯誤位置,第六行
File "E:/PycharmProjects/Python_file/write_blog/除錯.py", line 4, in bar return foo(s) * 2
bar函式中,return語句發生錯誤,錯誤位置,第四行
File "E:/PycharmProjects/Python_file/write_blog/除錯.py", line 2, in foo return 10 / int(s)
foo函式中,發生錯誤,錯誤位置,第二行。
ZeroDivisionError: division by zero
第二行的具體錯誤原因:0為除數。
二,除錯
當出現bug的時候,總要去定位。定位錯誤,除了直接看呼叫棧,還有一些輔助手段。
1,利用print函式,將有所懷疑的變數打印出來。優點:簡單直接粗暴有效 缺點:用完得刪,處處print
2,利用assert斷言,斷言失敗,丟擲異常。優點:不用像print一樣自己找 缺點:用完得刪,處處assert
補充:assert可以在直譯器中用-o引數關閉,當做pass。
示例:
def foo(s): print('除數=%d'%s) #執行結果:除數=0 assert s!=0 ,'除數不能為0' #執行結果:AssertionError: 除數不能為0 return 10 / int(s) def main(): foo(0) main()
3,logging ,將錯誤資訊,分級別輸出。有debug
,info
,warning
,error
等。
示例:
import logging
logging.basicConfig(level=logging.INFO)
def foo(s):
print('除數=%d'%s) #執行結果:除數=0
logging.info('除數等於%s'%s)
4,利用IDE進行除錯,比如pycharm
step 1:在需要的程式碼前,設定斷點。行號後單擊設定,雙擊取消。
step 2:shift+F9 開始debug(除錯)
step 3:開始進行debug,F8
然後根據下方變數進行分析。