错误
基本错误类型
https://docs.python.org/2/library/exceptions.html#exception-hierarchy
try...except...finally
<span style="font-family:Microsoft YaHei;">try:
print 'try...'
r = 10 / 0
print 'result:', r
except ZeroDivisionError, e:
print 'except:', e
finally:
print 'finally...'
print 'END'</span>
用logging记录错误
如果不捕获错误,自然可以让python的解释器来打印出错误堆栈,但程序也同时结束了
利用python内置的logiing模块可以非常容易地记录错误信息,同时让程序继续执行下去
<span style="font-family:Microsoft YaHei;">import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except StandardError, e:
logging.exception(e)
main()
print 'END'</span>
raise抛出错误
只有在必要的时候才定义我们自己的错误类型。如果可以选择Python已有的内置的错误类型(比如ValueError,TypeError),尽量使用Python内置的错误类型。
class FooError(StandardError):
pass
def foo(s):
n = int(s)
if n==0:
raise FooError('invalid value: %s' % s)
return 10 / n
调试
print 简单粗暴
assert
<span style="font-family:Microsoft YaHei;">def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
#assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错。
return 10 / n
def main():
foo('0')</span>
测试
单元测试
单元测试:用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作,可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。
单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。
单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。
文档测试
doctest非常有用,不但可以用来测试,还可以直接作为示例代码
什么输出也没有。这说明我们编写的doctest运行都是正确的
当模块正常导入时,doctest不会被执行。只有在命令行运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行。
什么输出也没有。这说明我们编写的doctest运行都是正确的
当模块正常导入时,doctest不会被执行。只有在命令行运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行。
<span style="font-family:Microsoft YaHei;">class Dict(dict):
'''
Simple dict but also support access as x.y style.
>>> d1 = Dict()
>>> d1['x'] = 100
>>> d1.x
100
>>> d1.y = 200
>>> d1['y']
200
>>> d2 = Dict(a=1, b=2, c='3')
>>> d2.c
'3'
>>> d2['empty']
Traceback (most recent call last):
...
KeyError: 'empty'
>>> d2.empty
Traceback (most recent call last):
...
AttributeError: 'Dict' object has no attribute 'empty'
'''
def __init__(self, **kw):
super(Dict, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Dict' object has no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
if __name__=='__main__':
import doctest
doctest.testmod()</span>