1 Python 异常处理参考

本节简单罗列 Python 语言中与异常处理有关的常用语句形式及用法。 发生错误时通常由系统自动抛出异常,但也可由程序自己抛出并捕获。

捕获并处理异常:try-except

发生错误时,如果应用程序没有预定义的处理代码,则由 Python 的缺省异常处理机制 来处理,处理动作是中止应用程序并显示错误信息。如果程序自己处理异常,可编写 try-except 语句来定义异常处理代码。详见前面各节。

手动抛出异常:raise 异常可以由系统自动抛出,也可以由我们自己的程序手动抛出。Python 提供 raise 语句

用于手动抛出异常。下面的语句抛出一个 ValueError 异常,该异常被 Python 的缺省异常处 理程序捕获:

  1. >>> raise ValueError
  2. Traceback (most recent call last): File "<stdin>", line 1, in <module>
  3. ValueError

除了错误类型,raise 语句还可以带有错误的描述信息:

  1. >>> raise ValueError, "Wrong value!"
  2. Traceback (most recent call last): File "<stdin>", line 1, in <module>
  3. ValueError: Wrong value!

当然也可以由程序自己处理自己抛出的异常,例如

  1. >>> try:
  2. raise ValueError
  3. except ValueError:
  4. print "Exception caught!"
  5. Exception caught!

用户自定义异常

前面程序例子中抛出的都是 Python 的内建异常,我们也可以定义自己的异常类型。为 此目的,需要了解 Python 的异常类 Exception 以及类、子类、继承等面向对象程序设计概念, 这些概念将在第 x 章中介绍。这里我们用下面的简单例子演示大致用法,以使读者先获得一 个初步印象:

  1. >>> class MyException(Exception):
  2. pass

这是一个类定义,它在 Python 内建的 Exception 类的基础上定义了我们自己的异常类 MyException。虽然语句 pass 表明我们并没有在 Exception 类的基础上添加任何东西,但 MyException 确实是一个新的异常类,完全可以像 Python 内建的各种异常一样进行抛出、捕 获。例如:

  1. >>> try:
  2. raise MyException
  3. except MyException:
  4. print "MyException caught!"
  5. MyException caught!

确保执行的代码:try-finally

一般来说,发生异常之后,控制都转到异常处理代码,而正常算法部分的代码不再执行。

Python 的异常处理还允许我们用 try-finally 语句来指定这样的代码:不管是否发生异常,这 些代码都必须执行。这种机制可以用来完成出错后的扫尾工作。例如:

  1. >>> try:
  2. x = input("Enter a number: ")
  3. print x
  4. finally:
  5. print "This is final!"
  6. Enter a number: 123
  7. 123
  8. This is final!

本例中,我们为 x 输入了一个正常数值 123,故 try 语句块没有发生异常,显示 123 后 又执行了最后的 print 语句。为什么不写成如下形式呢?

  1. x = input("Enter a number: ")
  2. print x
  3. print "This is final!"

区别在于,当发生错误时,这种写法就有可能未执行最后的 print 语句,而 try-finally 的写法则在发生异常的情况下也会确保执行最后的 print 语句。例如我们再次执行上面的语 句:

  1. >>> try:
  2. x = input("Enter a number: ")
  3. print x
  4. finally:
  5. print "This is final!"
  6. Enter a number: abc
  7. This is final!
  8. Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<string>", line 1, in <module>
  9. NameError: name 'abc' is not defined

可见,由于输入数据错误,导致 try 语句块发生异常而无法继续,但 finally 下面的 语句却得到了执行。仅当 finally 部分确保执行之后,控制才转到(缺省)异常处理程序 来处理捕获到的异常。

一般形式:try-except-finally

这种形式的异常处理语句综合了 try-except 和 try-finally 的功能。首先执行 try 部分,如 果一切正常,再执行 finally 部分。try 部分如果出错,则还是要执行 finally 部分,然后再由 except 部分来处理异常。