1. 程式人生 > >Python基礎(16):除錯是個技術活……

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 ,將錯誤資訊,分級別輸出。有debuginfowarningerror等。

示例:

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

然後根據下方變數進行分析。