一,调用栈
定义:调用函数链。
用途:当出现错误时,分析调用栈可以定位出具体的错误位置。
示例:
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
然后根据下方变量进行分析。