• Python学习11


    错误、调试和测试

    错误处理

    try

    让我们用一个例子来看看try的机制:

    try:
        print('try...')
        r = 10 / 0
        print('result:', r)
    except ZeroDivisionError as e:
        print('except:', e)
    finally:
        print('finally...')
    print('END')
    

    当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

    上面的代码在计算10 / 0时会产生一个除法运算错误:

    从输出可以看到,当错误发生时,后续语句print('result:', r)不会被执行,except由于捕获到ZeroDivisionError,因此被执行。最后,finally语句被执行。然后,程序继续按照流程往下走。

    调试

    第一种方法简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看

    print()最大的坏处是将来还得删掉它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息

    断言

    凡是用print()来辅助查看的地方,都可以用断言(assert)来替代:

    def foo(s):
        n = int(s)
        assert n != 0, 'n is zero!'
        return 10 / n
    
    def main():
        foo('0')
    

    assert的意思是,表达式n != 0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会出错。

    如果断言失败,assert语句本身就会抛出AssertionError

    $ python err.py
    Traceback (most recent call last):
      ...
    AssertionError: n is zero!
    

    程序中如果到处充斥着assert,和print()相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert

    $ python -O err.py
    Traceback (most recent call last):
      ...
    ZeroDivisionError: division by zero
    
     注意:断言的开关“-O”是英文大写字母O,不是数字0。

    关闭后,你可以把所有的assert语句当成pass来看。

    logging

    print()替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件

    pdb

    第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。

  • 相关阅读:
    图解集合5:不正确地使用HashMap引发死循环及元素丢失
    图解集合4:HashMap
    图解集合3:CopyOnWriteArrayList
    图解集合2:LinkedList
    SharePoint PowerShell 修改母版页
    SharePoint PowerShell 启动工作流
    SharePoint REST 服务获取讨论版问题
    SharePoint 前端开发常用的对象之_spPageContextInfo
    SharePoint 读取内容的插件之SharepointPlus
    SharePoint 配置PowerShell任务计划
  • 原文地址:https://www.cnblogs.com/tangmf/p/14103424.html
Copyright © 2020-2023  润新知