python学习-7-异常 错误 调试 测试

错误处理

  • 使用错误代码 代指 错误类型
    • 正常结果与错误码混合在一起,容易混淆
      • 所以必须抛出错误类型
    • 一旦出错,还得一层层上报
  • 错误也是一个类,错误与错误之间也有者关系,例如父子关系
  • 需要对不同类型的错误进行识别与区分,并针对性的进行处理
  • python的错误是class,所有的 都继承自 BaseException
try:
    foo()
except ValueError as e:
    ssss
except xxxx:
    ssss
finally:
    ssss
  • 需要注意,如果代码捕获的错误有父子关系,子在前,父在后,防止提前被捕获
  • try-except的好处在于 可以跨越多层捕获,只要main捕获到就ok
  • 若未被捕获,则会一直往上抛,直到被python解释器捕获,最终打印出来
    • 打印的顺序是从高往低
    • 最终可以定位到错误语句
    • python解释器打印错误信息,会将程序中止
  • python内置的logging模块可以很容易的记录错误信息
    • logging也可以将错误信息记录到日志文件中
# 打印错误信息,与python解释器输出一样,但不会中止程序
import logging
logging.exception(e)
  • 有的时候,我们捕获了错误,但是不知道如何处理,可以先打印信息,然后继续raise(不带参数)抛出

调试

  • print (low)
  • 断言
    • eg:assert n!=0, 'n is zero'
    • n必须为0,否则抛出AssertionError: n is zero
    • python解释器可以用 -0 参数关闭assert,之后就相当于pass
  • logging
    • 使用logging代替print,打印变量的值
    • logging.basicConfig(level=logging.INFO) 定义日志等级
    • debug,info,warning,error,靠右原则,info时debug失效
  • pdb
    • python解释器的debug
  • ide的端点debug

单元测试

  • 对一个模块/函数/类进行正确性检验的测试工作
  • 把测试用例放到一个测试模块中,就是一个完整的单元测试
  • 使用
    • 编写一个测试类,继承unittest.TestCase
    • 每一类测试都写一个test_xxx()方法(严格规范)
    • 最常用的是self.assertEqual(方法,期待值)
    • 期待抛出的指定类型的Error
    # 当d['empty']访问不存在的key时,断言就会抛出KeyError
    with self.assertRaises('KeyError'):
        value = d['empty']
    
  • 直接运行脚本就ok,批量运行多个单元测试
  • setUp与tearDown方法
    • 在每个单元测试前后执行
    • 例如连接数据库,关闭数据库

文档测试

  • python官方文档文友一些示例代码
  • doctest可直接提取注释中的代码并执行测试
  • 运行py,啥问题没有,就说明示例代码写的没有问题