语法错误:SyntaxError

除以0错误:ZeroDivisionError

列表下标越界 IndexError

类型错误 TypeError

访问变量不存在 NameError

字典关键字不存在 KeyError

未知的变量属性 AttributeError

调用栈:出错的时候,一定要分析错误的调用栈信息,才能定位错误的位置。

捕捉错误

try:
<检测语句>
except <错误类型> as e:
<处理异常>
finally:
<语句块>
else:
<语句块>
可以有多个except来捕获不同类型的错误:
image.png
Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”。
image.png

记录错误:

既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。
Python内置的logging模块可以非常容易地记录错误信息。
通过配置,logging还可以把错误记录到日志文件里,方便事后排查。

Python内置的try…except…finally用来处理错误十分方便。出错时,会分析错误信息并定位错误发生的代码位置才是最关键的。
程序也可以主动抛出错误,让调用者来处理相应的错误。但是,应该在文档中写清楚可能会抛出哪些错误,以及错误产生的原因。

#几种调试方式:

1print出来看看

2断言

凡是用print()来辅助查看的地方,都可以用断言(assert)来替代
$ python -O err.py
注意:断言的开关“-O”是英文大写字母O,不是数字0。
关闭后,你可以把所有的assert语句当成pass来看

3logging

把print()替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件
import logging
logging.basicConfig(level=logging.INFO)
logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

4 命令行使用 pdb

pdb.set_trace()

5,IDE

如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有:
Visual Studio Code:https://code.visualstudio.com/,需要安装Python插件。
PyCharm:http://www.jetbrains.com/pycharm/
另外,Eclipse加上pydev插件也可以调试Python程序。

单元测试

测试驱动开发”(TDD:Test-Driven Development)
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作.
这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的

为了编写单元测试,我们需要引入Python自带的unittest模块,编写mydict_test.py
一旦编写好单元测试,我们就可以运行单元测试。

总结
单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。
单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。
单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。
单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。

文档测试

if name==’main‘:
import doctest
doctest.testmod()
注意到最后3行代码。当模块正常导入时,doctest不会被执行。只有在命令行直接运行时,才执行doctest。
doctest非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含doctest的注释提取出来。用户看文档的时候,同时也看到了doctest。
doctest严格按照Python交互式命令行的输入和输出来判断测试结果是否正确, 严格到一个“空格”都需要对应!!

image.png