python学习(九):异常、调式与测试

异常

  • Python内置的try…except…else…finally用来处理错误十分方便。出错时,会分析错误信息并定位错误发生的代码位置才是最关键的。程序也可以主动抛出错误,让调用者来处理相应的错误。但是,应该在文档中写清楚可能会抛出哪些错误,以及错误产生的原因。
  • raise语句如果不带参数,就会把当前错误原样抛出,此外,在except中raise一个Error,还可以把一种类型的错误转化成另一种类型,只要是合理的转换逻辑就可以,但是,决不应该把一个Error转换成毫不相干的另外的Error。
  • 只有在必要的时候才定义我们自己的错误类型。如果可以选择Python已有的内置的错误类型(比如ValueError,TypeError),尽量使用Python内置的错误类型。
  • 错误应该有很多种类,如果发生了不同类型的错误,应该由不同的except语句块处理。没错,可以有多个except来捕获不同类型的错误。

调式方法:

程序能一次写完并正常运行的概率很小,基本不超过1%。总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。方法如下:

print()

把可能有问题的变量打印出来看看,最大的坏处是:将来还得删掉它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息。

assert(bool-expression)

如为真,断言成功,程序继续执行;反之,assert语句本身就会抛出AssertionError。程序中如果到处充斥着assert,和print()相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert,关闭后,你可以把所有的assert语句当成pass来看。

logging(重要)

和assert比,logging不会抛出错误,而且可以输出到文件。
默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

pdb

Python自带的pdb库,发现用pdb来调试程序还是很方便的,当然了,什么远程调试,多线程之类,pdb是搞不定的。常用的调试命令:
h(elp),会打印当前版本Pdb可用的命令,如果要查询某个命令,可以输入 h [command],例如:“h l” — 查看list命令;
l(ist),可以列出当前将要运行的代码块 ;
n(ext),让程序运行下一行,如果当前语句有一个函数调用,用n是不会进入被调用的函数体中的;
s(tep),跟n相似,但是如果当前有一个函数调用,那么s会进入被调用的函数体中;
c(ont(inue)),让程序正常运行,直到遇到断点;
j(ump),让程序跳转到指定的行数;
q(uit),退出调试 .

IDE

IDE
如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有PyCharm.

小结

写程序最痛苦的事情莫过于调试,程序往往会以你意想不到的流程来运行,你期待执行的语句其实根本没有执行,这时候,就需要调试了。虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器。


单元测试

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值