nullPython程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
Programming in PythonPython程序设计
Programming in Python主讲:庞胜利第九章 异常处理*第九章 异常处理异常处理
异常捕获
try...finally
抛出异常
异常机制使用
异常处理异常处理异常处理是一种出错处理的机制。当程序中出现某些 异常的 状况的时候,异常就发生了。例如,当想要读某个文件的时候,而那个文件不存在。或者在程序运行的时候,不小心除了0。上述这些情况可以使用异常来处理。
假如程序中有一些无效的(产生异常)语句,会怎么样呢?Python会引发并告知那里有一个错误,从而处理这样的情况。>>> print 2/0
Traceback (most recent call last):
File "
", line 1, in
ZeroDivisionError: integer division or modulo by zero错误信息错误信息
异常信息分为两个部分,冒号前面的是异常类型,之后是对此的简单说明。其它的信息则指出在程序的什么地方出错了。
当异常产生时,如果没有代码来处理它,Python对其进行缺省处理,输出一些异常信息并终止程序。>>> print 2/0
Traceback (most recent call last):
File "", line 1, in
ZeroDivisionError: integer division or modulo by zero异常捕获异常捕获程序在执行的过程中产生异常,但不希望程序终止执行,这时就需要用try和except 语句对异常进行捕获然后处理。比如,提示用户输入文件名,然后打开文件。若文件不存在,我们也不想程序就此崩溃,处理异常处理就成了关键的部分。
异常捕获异常捕获
首先执行statements1,如果没有异常发生,那么一切正常,就像没有try语句一样,继续执行后面的语句
如果在执行statements1时发生了异常,那么就把异常类型和except语句后面的ExceptionType比较
如果相同就执行statements2;并继续执行异常处理后的所有语句
如果不相同就直接返回,把异常抛给函数的调用者,然后一级一级的向上抛,直到有try语句捕获了异常
如果没有任何try语句进行有效的捕获,那么程序就异常退出try:
except ExceptionType:
异常捕获异常捕获可见,异常是另一种函数返回方式,C语言或者其他没有异常机制的语言,函数只有通过返回值指明函数出错,所以每一级函数都要检查函数的返回值。
异常机制就是提供除了返回值之外的另一种出错处理方法。这种方法支持错误的向上冒泡,如果某一级函数不知道该怎么处理错误,那么就不处理,留给更上一级函数处理。大部分库中的模块的出错处理大多数都是抛出异常。异常捕获异常捕获try后面可以跟多种形式的分句:
try:
except ExceptionType1, e1:
except (ExceptionType2, ExceptionType3):
except:
else:
finally:
try语句分句形式try语句分句形式try...finallytry...finally
finally语句的意思是:无论是否发生异常,还是return语句返回,finally子句statements2都会执行
这种方法适合于释放资源。如果一个函数有多个地方return,那么就要在每一个return之前编写几乎同样的释放资源的代码,如关闭文件、关闭网络连接等等。finally的方法提供了一个函数返回之前,执行一些代码来回收资源,不管函数返回是由于return语句还是由于没有被捕获的异常try:
finally:
>>> def fun():
... try:
... print "ok"
... return 1
... finally:
... print "clean up"
...
>>> fun()
ok
clean up
1
>>>抛出异常抛出异常raise语句用于抛出异常,格式如下:
三个表达式都是可选的,如果一个表达式都没有,raise则把最近的一次异常重新触发,如果没有最近的异常则抛出TypeError的异常
如果至少有一个表达式的话,raise语句则计算表达式而得到三个对象,对于省略的表达式用None填充
如果第一个对象是一个对象实体,则异常的类型就是对象的类型,对象本身是异常的值;第二、三个对象必须为空
如果第一个对象是类,那它就是异常的类型。第二个对象被用来决定异常的值:如果是类的实例对象,则对象就是异常的值;如果是个元组,就作为类构造器的参数列表;如果为None,则空参数传入类构造器,如果为其他单个对象,则作为单个参数传入类构造器。实例对象就会根据参数列表传入类构造器而生成,并作为异常的值。
如果第三个对象存在并不为None,它必须是一个traceback对象,用于跟踪当前发生异常的栈帧(很少用)。raise expression1, expression2, expression3抛出异常抛出异常在抛出异常时,可以是任何对象,用于详细描述错误类型;但一般要求是Exception类的子类
class ShortInputException:
'''A user-defined exception class.'''
def __init__(self, length, atleast):
self.length = length
self.atleast = atleast
try:
s = raw_input('Enter something --> ')
if len(s) < 3:
raise ShortInputException(len(s), 3)
except ShortInputException, x:
print 'ShortInputException: The input was of length %d, \
was expecting at least %d' % (x.length, x.atleast)
else:
print 'No exception was raised.'抛出异常抛出异常在except中,只要ExceptionType和抛出的对象类型一致,就可以捕获这个异常。类型一致指:对象是此类型的一个实例,如果一个对象所属的类继承了其他的类,那么这个对象就可以是多类型的实体,这些类型包括对象所属的类的父类,父类的父类...等
assert语句assert语句Python还包括了assert语句,其实是条件式的raise语句:
如果test计算为假,Python就会触发AssertionError异常:data项是异常对象的值。
assert是附加功能,如果使用-O命令行标志位,就会忽略所有的assert语句,即__debug__为0;系统缺省情况下自动为1assert ,
========================
if __debug__:
if not :
raise AssertionError, 异常使用异常使用抛出和捕获异常提供了一种方便的出错处理机制。函数不用再通过特殊返回值来通知上一级函数(函数的调用者)发生了错误,而是通过raise异常的方式
返回值就是函数正常返回的时候应该返回的东西
这种方法可以加快开发速度,开发初期,可以不用处理任何错误,只按照正常结果进行编码,等原型开发完成后再加入异常处理的代码本章结束,谢谢!本章结束,谢谢!