Python学习之旅(二十一)
Python基础知识(20):错误、调试和测试
一、错误处理
在运行程序的过程中有可能会出错,一般我们会在添加一段代码在可能出错的地方,返回约定的值,就可以知道会不会出错以及出错的原因
1、使用try......except......finally......错误处理机制
try...可能会出异常的代码
except...如果try后面的代码出错,则运行这里的语句;否则直接运行finally语句
finally...无论try语句是否出错都会运行
- try:
- z=5/0
- print("ressult=",zip)
- except ZeroDivisionError:
- print("The second number can't be number!")
- finally:
- print("I'm here.")
- The second number can't be number!
- I'm here.
多个except语句
- try:
- z=5/5
- print("ressult=",z)
- except ValueError as e:
- print('ValueError:', e)
- except ZeroDivisionError as e:
- print('ZeroDivisionError:', e)
- else:
- print('No error!')
- finally:
- print("I'm here.")
2、记录错误
使用logging模块可以记录出错信息
通过配置,可以让logging记录出错的信息到日志,以便日后排查
- #testlog.py
import logging- def test(x):
- return 5/int(x)
- def main():
- try:
- test("")
- except Exception as e:
- logging.exception(e)
- main()
- print("END")
同样是出错,但程序打印完错误信息后会继续执行,并正常退出
- ERROR:root:division by zero
- Traceback (most recent call last):
- File "D:/Python/doit/testLog.py", line 7, in main
- test("")
- File "D:/Python/doit/testLog.py", line 4, in test
- return 5/int(x)
- ZeroDivisionError: division by zero
- END
3、抛出错误
使用raise语句
如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise
语句抛出一个错误的实例
- #testError
- class testError(ValueError):
- pass
- def test(x):
- y = int(x)
- if y==0:
- raise testError('invalid value: %s' % x)
- return 10 / y
- test('')
- Traceback (most recent call last):
- File "D:/Python/doit/testError.py", line 11, in <module>
- test('')
- File "D:/Python/doit/testError.py", line 8, in test
- raise testError('invalid value: %s' % x)
- testError: invalid value: 0
注:只有为完成某些需要时我们才自己定义错误类型,日常一般使用Python内置的错误类型
二、调试
1、用print打印能出错的变量
2、断言assert
使条件为真,保证程序正常运行下去,否则抛出AssertionError
可以在条件后添加字符串,用来解释断言
- def test(x):
- y=int(x)
- assert y!=0,"y is zero"
- return 5/y
- def main():
- test("")
- main()
- Traceback (most recent call last):
- ......
- AssertionError: y is zero
3、logging
允许指定记录出错信息的日志级别等级:critical > error > warning > info > debug
- #logErro.py
- import logging
- logging.basicConfig(level=logging.INFO)
- x=""
- y=int(x)
- ogging.info("y=%d"%y)
- print(5/y)
- Traceback (most recent call last):
- File "D:/Python/doit/logErro.py", line 6, in <module>
- ogging.info("y=%d"%y)
- NameError: name 'ogging' is not defined
4、pdb
Python调试器,需要单步执行
5、pdb.set_trace
这个方法也是用pdb,但是不需要单步执行,只需要import pdb
,然后在可能出错的地方放一个pdb.set_trace()
,就可以设置一个断点
6、IDE
可以设置断点、单步执行
需要安装Python IDE
三、测试
单元测试
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作
这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的
单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证
单元测试的测试用例要覆盖常用的输入组合、边界条件和异常
单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug
单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug
setUp与tearDown
可以在单元测试中编写两个特殊的setUp()
和tearDown()
方法。这两个方法会分别在每调用一个测试方法的前后分别被执行
文档测试
Python内置的“文档测试”(doctest)模块可以直接提取注释中的代码并执行测试
当模块正常导入时,doctest不会被执行。只有在命令行直接运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行
doctest非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含doctest的注释提取出来。用户看文档的时候,同时也看到了doctes
Python学习之旅(二十一)的更多相关文章
- Python学习之旅(十一)
Python基础知识(10):函数(Ⅱ) 一.全局变量和局部变量 局部变量:在函数内定义的变量,在函数内使用 全局变量:在函数外定义的变量,在程序任何地方都可以使用 1.全局变量与局部变量同名 这时函 ...
- python学习笔记(二十一)构造函数和析构函数
python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...
- 180分钟的python学习之旅
最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时 ...
- Python学习笔记(二)——列表
Python学习笔记(二)--列表 Python中的列表可以存放任何数据类型 >>> list1 = ['Hello','this','is','GUN',123,['I','Lov ...
- Directx11学习笔记【二十一】 封装键盘鼠标响应类
原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...
- python学习02python入门二
学前须知:1.本文档有关内容均建立在python3.x版本上,python2.x已经成为历史,如有需要,文内会特别说明. 2.本文使用的编辑器多为架构在Windows上的pycharm,如需了解Lin ...
- 【Python学习笔记之二】浅谈Python的yield用法
在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...
- Python学习笔记(二):条件控制语句与循环语句及常用函数的用法
总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...
- Python学习系列(二)(基础知识)
Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比, ...
- 滴滴Booster移动APP质量优化框架 学习之旅 二
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...
随机推荐
- KVM之CPU虚拟化
1.1 为什么要虚拟化CPU 虚拟化技术是指在x86的系统中,一个或以上的客操作系统(Guest Operating System,简称:Guest OS)在一个主操作系统(Host Operatin ...
- CAS 单点登录【1】入门
1. CAS 的引入的前提和好处 很早期的公司,一家公司可能只有一个应用,慢慢的应用开始变多,如员工报销系统.审核系统.学习系统...... 每个应用都要进行注册登录,退出的时候又要一个个退出,用户操 ...
- webstorm激活方法webstorm注册码 jetbrains激活
安装完成后,打开 WebStorm, 在打开的 License Activation 窗口中选择 License server. 在输入框输入网址即可: http://idea.codebeta.cn ...
- shell脚本启动语法错误syntax error near unexpected token '{
执行shell脚本时失败,报语法错误,但脚本内容检查正常 原因为该脚本是在非Linux系统下编辑之后放到系统执行的,文件模式类型非Linux系统匹配的模式类型. 查看文件的模式类型 显示文件的模式类型 ...
- iOS实现pdf文件预览,上下翻页、缩放,读取pdf目录
最近有个朋友想做一个pdf预览,要求能够上下滑动翻页.带缩放.目录跳转功能. 因为之前我只做过简单的预览,那时直接用uiwebview实现的,这次找了下资料,发现一个比较好的库. 其原理实现: 自定义 ...
- 单片机成长之路(51基础篇) - 007 CH340CH341最全说明
比较全的CH340,CH341应用说明 CH340 以前用USB转串口时图方便一般也都是直接买现成的USB转串口模块,但是后面设计需要,不等不将CH340这个模块集成到电路板中,经过多次失败,终于得到 ...
- vim资源
1.http://vimcasts.org vim技巧,还有一个高达120美元的课程 目前,正在看http://vimcasts.org/blog/2013/02/habit-breaking-hab ...
- fiddler 对https支持
https://www.cnblogs.com/joshua317/p/8670923.html 测试可行
- .NET HttpGet 获取服务器文件下的图片信息 同步和异步方式处理
/// <summary> /// 项目文件夹下路径 返回流类型数据,如:图片类型 /// </summary> /// <returns></returns ...
- MySQL架构总览->查询执行流程->SQL解析顺序
Reference: https://www.cnblogs.com/annsshadow/p/5037667.html 前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后 ...