捕获并处理异常:try-except

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

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

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

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

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

    用户自定义异常

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

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

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

    确保执行的代码:try-finally

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

    1. >>> try:
    2. finally:
    3. print "This is final!"
    4. Enter a number: 123
    5. 123
    6. This is final!

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

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

    1. print x
    2. finally:
    3. print "This is final!"
    4. Enter a number: abc
    5. This is final!

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

    一般形式:try-except-finally

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