1 Python 异常处理参考
本节简单罗列 Python 语言中与异常处理有关的常用语句形式及用法。 发生错误时通常由系统自动抛出异常,但也可由程序自己抛出并捕获。
捕获并处理异常:try-except
发生错误时,如果应用程序没有预定义的处理代码,则由 Python 的缺省异常处理机制 来处理,处理动作是中止应用程序并显示错误信息。如果程序自己处理异常,可编写 try-except 语句来定义异常处理代码。详见前面各节。
手动抛出异常:raise 异常可以由系统自动抛出,也可以由我们自己的程序手动抛出。Python 提供 raise 语句
用于手动抛出异常。下面的语句抛出一个 ValueError 异常,该异常被 Python 的缺省异常处 理程序捕获:
>>> raise ValueError
Traceback (most recent call last): File "<stdin>", line 1, in <module>
ValueError
除了错误类型,raise 语句还可以带有错误的描述信息:
>>> raise ValueError, "Wrong value!"
Traceback (most recent call last): File "<stdin>", line 1, in <module>
ValueError: Wrong value!
当然也可以由程序自己处理自己抛出的异常,例如
>>> try:
raise ValueError
except ValueError:
print "Exception caught!"
Exception caught!
用户自定义异常
前面程序例子中抛出的都是 Python 的内建异常,我们也可以定义自己的异常类型。为 此目的,需要了解 Python 的异常类 Exception 以及类、子类、继承等面向对象程序设计概念, 这些概念将在第 x 章中介绍。这里我们用下面的简单例子演示大致用法,以使读者先获得一 个初步印象:
>>> class MyException(Exception):
pass
这是一个类定义,它在 Python 内建的 Exception 类的基础上定义了我们自己的异常类 MyException。虽然语句 pass 表明我们并没有在 Exception 类的基础上添加任何东西,但 MyException 确实是一个新的异常类,完全可以像 Python 内建的各种异常一样进行抛出、捕 获。例如:
>>> try:
raise MyException
except MyException:
print "MyException caught!"
MyException caught!
确保执行的代码:try-finally
一般来说,发生异常之后,控制都转到异常处理代码,而正常算法部分的代码不再执行。
Python 的异常处理还允许我们用 try-finally 语句来指定这样的代码:不管是否发生异常,这 些代码都必须执行。这种机制可以用来完成出错后的扫尾工作。例如:
>>> try:
x = input("Enter a number: ")
print x
finally:
print "This is final!"
Enter a number: 123
123
This is final!
本例中,我们为 x 输入了一个正常数值 123,故 try 语句块没有发生异常,显示 123 后 又执行了最后的 print 语句。为什么不写成如下形式呢?
x = input("Enter a number: ")
print x
print "This is final!"
区别在于,当发生错误时,这种写法就有可能未执行最后的 print 语句,而 try-finally 的写法则在发生异常的情况下也会确保执行最后的 print 语句。例如我们再次执行上面的语 句:
>>> try:
x = input("Enter a number: ")
print x
finally:
print "This is final!"
Enter a number: abc
This is final!
Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<string>", line 1, in <module>
NameError: name 'abc' is not defined
可见,由于输入数据错误,导致 try 语句块发生异常而无法继续,但 finally 下面的 语句却得到了执行。仅当 finally 部分确保执行之后,控制才转到(缺省)异常处理程序 来处理捕获到的异常。
一般形式:try-except-finally
这种形式的异常处理语句综合了 try-except 和 try-finally 的功能。首先执行 try 部分,如 果一切正常,再执行 finally 部分。try 部分如果出错,则还是要执行 finally 部分,然后再由 except 部分来处理异常。