错误调试和测试
在代码编写和运行过程中总会遇到各种错误,这是不可避免的;
- 错误处理
1、错误基类BaseException类似java的try catch finally和Exception类;
try:
...
Except _ as _:
...
finally:
2、可以多层跨越处理,不用每一层都去捕获错误,只需要在适当的位置捕获一次就行了,因为错误没有捕获时,他就会一直往上抛,最后被python解释器捕获并打印错误信息;
- 调用堆栈
利用打印的信息,查找错误出现在那里
- 记录错误
Logging模块可以记录错误信息并打logging.exception(e)抛出错误(raise)
可根据自己的需要创建一个自定义错误,raise如果不带参数,就会把错误原样抛出,在except中raise一个Error,还可以把一种类型的错误转化成另外一种,但不建议乱来;
核心原则:我们应该清楚在什么位置出现什么错误;
- 调试
1、断言(assert):可以用参数-0来控制assert,当参数为-0时assert相当于pass:
assert n != 0, 'n is zero!'#n!=0时是Ture
$ python3 -O err.py#参数控制
2、logging不会抛出错误,还可以输出到文件:logging.info(),且分为如下四个级别:Debug、Info、Warning、Error;
logging.basicConfig(level=logging.INFO)
3、调试器pdb:python -m pdb err.py启动调试器;
输入1查看代码;
输入n单步执行代码;
輸入p查看变量;
输入q退出
4、pdb.set_trace()设置断点,再要需要地方放置一个断点即可;
- 单元测试
1、用来对一个模块、一个函数或者一个类进行正确性的检测;
2、引入模块import unittest;
3、编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承;
4、test开偷才会被认为是测试方法;
5、最常用的断言方法:assertEqual();
6、运行单元测试;
if __name__ == '__main__':
unittest.main()
7、setUp和tearDown
这两个方法会分别在每调用一个测试方法的前后分别被执行
- 文档测试
Python内置的“文档测试”(doctest)模块可以直接提取注释中的代码并执行测试,doctest严格按照Python交互式命令行的输入和输出来判断测试结果是否正确。只有测试异常的时候,可以用“…”表示中间一大段烦人的输出;