Python基础(16):调试是个技术活……

版权声明:转载请注明来处 https://blog.csdn.net/Daisy_zye/article/details/84845106

一,调用栈

定义:调用函数链。

用途:当出现错误时,分析调用栈可以定位出具体的错误位置。

示例:

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

然后根据下方变量进行分析。

猜你喜欢

转载自blog.csdn.net/Daisy_zye/article/details/84845106