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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值