1、错误处理
(1)常见的错误类型和继承关系看这里:
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
(2)如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出
出错的时候,一定要分析错误的调用栈信息,才能定位错误的位置
(3)Python内置的logging
模块可以非常容易地记录错误信息。
通过配置,logging
还可以把错误记录到日志文件里,方便事后排查
(4)如果要抛出错误,可以根据需要定义一个错误的class,选择好继承关系,然后用raise
语句抛出一个错误的实例
(5)raise
语句如果不带参数,就会把当前错误原样抛出
2、调试
(1)程序中如果到处充斥着assert
,和print()
相比也好不到哪去。不过,启动Python解释器时可以用-O
参数来关闭assert
(2)logging
的好处是,它允许你指定记录信息的级别,有debug
,info
,warning
,error
等几个级别。当我们指定level=INFO
时,logging.debug
就不起作用了;同理,指定level=WARNING
后,debug
和info
就不起作用了。logging
的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件
(3)启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态
(4)pdb.set_trace()
只需要import pdb
,然后在可能出错的地方放一个pdb.set_trace()
,就可以设置一个断点
(5)目前比较好的Python IDE有:
Visual Studio Code:https://code.visualstudio.com/,需要安装Python插件。
PyCharm:http://www.jetbrains.com/pycharm/
另外,Eclipse加上pydev插件也可以调试Python程序
3、单元测试
(1)写单元测试需要引入Python自带的unittest
模块
(2)测试类从unittest.TestCase
继承,以test
开头的方法就是测试方法,不以test
开头的方法不被认为是测试方法,测试的时候不会被执行
(3)运行单元测试最简单的方法是在脚本文件的最后加上两行代码:
if __name__ == '__main__':
unittest.main()
另一种方法是在命令行通过参数-m unittest
直接运行单元测试
(4)可以在单元测试中编写两个特殊的setUp()
和tearDown()
方法,这两个方法会分别在每调用一个测试方法的前后分别被执行
4、文档测试
(1)doctest非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含doctest的注释提取出来。用户看文档的时候,同时也看到了doctest