第10章 错误和异常(1)

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'
>>>


你可能感兴趣的:(异常)