美文网首页
四、错误、调试、测试

四、错误、调试、测试

作者: 井上皓 | 来源:发表于2018-10-02 06:42 被阅读0次

1.错误处理


try

try使用 结果

try内的代码一旦出错就会跳转到except语句块并且在出错代码处停止继续执行,然后在执行完except后,如果有finally语句块,则执行finally语句块。

那么如果try不出错那?

不出错时 结果

执行完try语句块后,不在执行except语句块的内容,但是还会执行finally语句块。

因为错误有很多种,所以就会有多个except来捕获不同类型的错误

多种异常 捕获到其他异常

注意:因为错误类型也是类有继承关系,所以就有以下例子发生。

继承关系

第二个except永远也捕获不到UnicodeError,因为UnicodeError是ValueError的子类如果有,也被第一个except给捕获了。

常见的错误类型和继承关系查看地址如下:

https://docs.python.org/3/library/exceptions.html#exception-hierarchy

跨越多层调用

比如函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了。

跨越多层调用

调用栈

如果错误没有被捕获,就会入栈被捕获并且被打印出来。

错误没有被捕获 打印错误信息

我们由上往下看打印的错误信息。从20行的main()方法的执行开始追本溯源,按照逻辑最终找到了15行出的错误。

15行出的具体错误

注意:因此出错的时候一定要仔细推敲打印的错误信息

记录错误

利用Python内置的logging模块可以非常容易地记录错误信息并且打印完错误信息后会继续执行,最后正常退出。

logging模块 打印错误并正常执行

通过配置,logging还可以把错误记录到日志文件里,方便事后排查。

自定义一个类接收抛出错误

自定义

根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误。

得出错误结果

注意:尽量使用Python内置的错误类型。

raise语句

raise语句如果不带参数,就会把当前错误原样抛出。

raise语句 结果

在打印一个ValueError!后,又把错误通过raise语句抛出去了的目的是:

捕获错误目的只是记录一下,便于后续追踪。


2.调试


第一种方法把可能有问题的变量打印出来,但是坏处是将来还得删掉它并且运行结果也会包含很多垃圾信息。

用print() 结果

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


(这里代码出了问题,例子之后补上。)

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

logging 结果

它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

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

出错的代码 执行的时候输入参数-m pdb   pdb使用

启动后,pdb定位到下一步要执行的代码并且在此行代码处会出现->符号。

l:查看代码

n:只执行一行的代码

p 变量名:查看变量

q:结束调试

第五种方式,这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点。

pdb.set_trace() 结果

程序会自动在pdb.set_trace()暂停并进入pdb调试环境,命令c会继续运行。

第六种方式是一个支持调试功能的IDE。

注意:logging才是最好用的调试工具

3.单元测试


单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

4.文档测试


代码与其他说明可以写在注释中,然后,由一些工具来自动生成文档。

只要这些代码本身就可以直接运行,那么就可以自动执行写在注释中的这些代码。

这就是Python内置的“文档测试”(doctest)模块,他可以直接提取注释中的代码并执行测试。

通过'''来把“文档测试”(doctest)模块的内容包围起来即可。

doctest严格按照Python交互式命令行的输入和输出来判断测试结果是否正确。只有测试异常的时候,可以用...表示中间一大段烦人的输出。

“文档测试”(doctest)模块   结果

什么输出也没有。这说明我们编写的doctest运行都是正确的。

如果程序有问题的话,再运行就会报错!

当模块正常导入时,doctest不会被执行。只有在命令行直接运行时,才执行doctest。

相关文章

  • 四、错误、调试、测试

    1.错误处理 try try内的代码一旦出错就会跳转到except语句块并且在出错代码处停止继续执行,然后在执行完...

  • Python 错误、调试和测试

    错误处理 调试 单元测试 文档测试

  • 软件测试理论

    测试和调试的区别 测试:发现程序的错误 调试:定位和纠正错误(保证软件的正常运行) 软件的危机 软件开发的费用超支...

  • 新手必看!测试中排错(调试)的基本方法

    软件测试中,排错(即调试)与成功的测试形影相随。测试成功的标志是发现了错误。根据错误迹象确定错误的原因和准确位置,...

  • 错误、调试和测试

    错误处理 在程序运行的过程中,如果发生错误,可以事先约定返回一个错误代码,这样就可以知道是否有错,以及出错的原因。...

  • 错误、调试和测试

    高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外。 ...

  • 错误、调试和测试

    错误处理 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原...

  • python 2.3 基础

    错误、调试和测试错误处理:try:运行代码,如果执行错误,则后续代码不会执行except:except error...

  • python错误、调试和测试

    错误处理 try与其他语言一样,python也有错误捕获的功能 Python的错误其实也是class,所有的错误类...

  • Python错误、调试和测试

    常见Excpte 内置 try...except...finally 记录错误 Python内置的logging模...

网友评论

      本文标题:四、错误、调试、测试

      本文链接:https://www.haomeiwen.com/subject/eeeooftx.html