前言:有的错误是程序编写有问题造成的,有的错误是用户输入造成的,还有一类错误是完全无法在程序运行过程中预测的,这类错误也称为异常。跟踪程序的执行,查看变量的值是否正确,这个过程称为调试,Python的pdb
可以让我们以单步方式执行代码。良好的测试,可以在程序修改后反复运行,确保程序输出符合我们编写的测试。
7.1 错误处理
Python内置了try...except...finally
的错误处理机制,避免逐级上报的麻烦。
try
try:
print 'try...'
r = 10 / 0
print 'result:', r
except ZeroDivisionError, e: #e相当于一种赋值?
print 'except:', e
finally:
print 'finally...'
print 'END'
当我们认为某些代码可能会出错时,就可以用try
来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except
语句块,执行完except
后,如果有finally
语句块,则执行finally
语句块,至此,执行完毕。
概括就是,觉得可能发生错误,用try
,except
后写上错误类型和执行语句(e?),有finally
必执行(不管有没有except
),注意:
使用!结果如下:
try...
except: integer division or modulo by zero
finally...
END
错误类型可以捕获,except
后的自动识别,所以为了准确捕获,可以多加几个,也就是多几个except
,至于错误类型有哪些,好好阅读官方文档吧= = 没有错误可以在except
后加else
,然而我觉得如果是个返回值的话,并没有什么必要,具体情况具体分析吧。
Python的错误是class
,全部继承自BaseException
,所以在使用错误类型时要注意,子类会被判断进去哦~如:
try:
foo()
except StandardError, e:
print 'StandardError'
except ValueError, e:
print 'ValueError'
第二个except
永远无法捕获到ValueError
,因为它是StandError
的子类,继承关系在这:https://docs.python.org/2/library/exceptions.html#exception-hierarchy
使用try...except
一个巨大的好处就是可以跨越多层调用。就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally
的麻烦。
要点:
try...except...finally
语句执行顺序与规则- 错误是一种
class
,注意父类与子类 - 跨多层调用,合适地方加入即可
调用堆栈
如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。
# err.py:
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
main()
$ python err.py
Traceback (most recent call last): 逐层抛错,直到可以识别的错误类型与最终源头
File "err.py", line 11, in <module>
main()
File "err.py", line 9, in main
bar('0')
File "err.py", line 6, in bar
return foo(s) *