10.1 什么是异常
10.1.1 错误
从软件方面来说,错误是语法或是逻辑上的。语法错误指示软件结构上有错误,导致不能被解释器解释或编译器编译。这些错误必须在程序执行前纠正。
逻辑错误可能是由于不完整或是不合法的输入所致;在其他情况下,还可能是逻辑无法生成、计算、或是输出结果需要的过程无法执行。这些错误分别被称为域错误或范围错误。
10.1.2 异常
异常是因为程序出现了错误而在正常控制流以外采取的行为。这个行为又分为两个阶段:首先是引起异常发生的错误,然后是检测(和采取可能的措施)阶段。
10.2 Python中的异常
NameError ZeroDivisionError SyntaxErrror IndexError KeyError AttributeError
SyntaxError异常是唯一不是在运行时发生的异常。它代表Python代码中有一个不正确的结构,在它改正之前程序无法执行。这些错误一般都是在编译时发生。
10.3 检测和处理异常
一个try语句可以对应一个或多个except子句,但只能对应一个finally子句,或是一个try-except-finally复合语句。
可以使用try-except语句检测和处理异常,也可以添加一个可选的else子句处理没有探测到异常的执行的代码。而try-finally只允许检测异常并做一些必要的清理工作,没有任何异常处理设施。
10.3.1 try-except语句
try语句块中异常发生点后的剩余语句永远不会到达,所以也永远不会执行。
>>> try:
... f = open("C:\\asdas")
... except IOError, e:
... print 'could not open file:', e
...
could not open file: [Errno 2] No such file or directory: 'C:\\asdas'
>>>
10.3.2 包装内建函数
>>> def safe_float(obj):
... try:
... return float(obj)
... except ValueError, e:
... print "This is an invalid value..."
... return None
...
>>> `safe_float("ads")`
This is an invalid value...
'None'
>>> `safe_float("123")`
'123.0'
>>>
10.3.3 带有多个except的try语句
>>> def safe_float1(obj):
... try:
... return float(obj)
... except ValueError, e:
... print "Value was invalid..."
... return None
... except TypeError, e:
... print "Type was invalid..."
... return None
...
>>> `safe_float1("ad")`
Value was invalid...
'None'
>>> `safe_float1(())`
Type was invalid...
'None'
>>>
10.3.4 处理多个异常的except语句
还可以在一个except子句里处理多个异常,except语句在处理多个异常时要求异常被放在一个元组里。
>>> def safe_float2(obj):
... try:
... return float(obj)
... except (TypeError, NameError, ValueError), e:
... print "Error: ",e
... return None
...
>>> `safe_float2('asd')`
Error: could not convert string to float: asd
'None'
>>>
10.3.5 捕获所有异常
BaseException是所有异常之母。
>>> def safe_float3(obj):
... try:
... return float(obj)
... except TypeError, e:
... print "TypeError: ", e
... return None
... except BaseException, e:
... print "Error: ", e
... return None
...
>>> `safe_float3("asd")`
Error: could not convert string to float: asd
'None'
>>> `safe_float3(())`
TypeError: float() argument must be a string or a number
'None'
>>>