错误处理
# coding=utf-8
import logging
try:
print 1 / 0
# print 1 / int('a')
# print 1 / 2
except ZeroDivisionError, e:
logging.exception(e) # 记录错误
print "exception:", e
except ValueError, e:
print "exception:", e
raise SystemError('input error!') # 将错误转为另一种错误抛出
except Exception, e:
print type(e)
raise # 将错误原样抛出
else: # 没有错误时执行
print "no error"
finally:
print "finally"
常见的错误类型和继承关系看这里:
https://docs.python.org/2/library/exceptions.html#exception-hierarchy
调试
- 使用print
- 断言
assert n != 0, 'n is zero!' # 表达式不为 True 抛出 AssertionError ,附带后面的信息
- logging
import logging
logging.basicConfig(level=logging.NOTSET)
s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n
logging有debug,info,warning,error...等多个级别,级别定高了低级别的信息就不会输出,可以输出到console或是文件等
- pdb
python -m pdb err.py
进入调试模式,l 查看代码,n 单步执行,p 变量名
查看变量,q 结束调试
- pdb.set_trace()
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 运行到这里会自动暂停
print 10 / n
运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c继续运行
单元测试
- “测试驱动开发”(TDD:Test-Driven Development)
- 编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。
- 以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。
-
assertEquals()
:
self.assertEquals(abs(-1), 1) # 断言函数返回的结果与1相等
- 另一种重要的断言就是期待抛出指定类型的Error,比如通过d['empty']访问不存在的key时,断言会抛出
KeyError
:
with self.assertRaises(KeyError):
value = d['empty']
- 运行单元测试
(1)最简单的运行方式是在mydict_test.py
的最后加上两行代码:
if __name__ == '__main__':
unittest.main()
将测试当做脚本运行
(2)在命令行通过参数-m unittest
运行
- setUp与tearDown
这两个方法会分别在每调用一个测试方法的前后分别被执行。可以进行一些资源打开与关闭的操作
文档测试
直接运行文档中的示例代码。文档注释一般在函数定义语句、类定义语句下一行开始,使用多行字符串的语法:
def abs(n):
"""
注释内容
"""
模块中文档测试代码:
if __name__ == "__main__":
import doctest
doctest.testmod()