1
Python编程从入门到实践
1.11.2.1 7.2.1 异常处理
7.2.1 异常处理

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时,需要捕获并处理它,否则程序会终止执行。

可以使用try/except语句来检测try语句块中的错误,从而让except语句捕获异常信息并处理。如果不想在异常发生时结束程序,只需在try里捕获它。以下为简单的try…except…else的语法:

try的工作原理是,当开始一个try语句后,Python就在当前程序的上下文中作标记,这样当异常出现时,就可以回到这里。try子句先执行,接下来会发生什么取决于执行时是否出现异常。

·当try后的语句执行时发生异常,Python就跳回到try并执行第一个匹配该异常的except子句。异常处理完毕后,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。

·如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。

·如果在try子句执行时没有发生异常,Python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。

【例7.11】异常处理。

打开一个文件,向该文件写入内容,且并未发生异常:

以上程序的输出结果如图7-9所示。

图7-9 程序输出

except语句后面可以不带异常类型,实例如下:

以上方式中,try…except语句捕获所有发生的异常。但这不是一个很好的方式,不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。也可以使用相同的except语句来处理多个异常信息,如下所示:

为了防止try中的语句块没有正常执行完毕,从而导致其他错误的发生,还需要给异常处理加上一个善后功能。使用finally关键字包含一段无论异常是否发生,都会执行的代码块。try…finally语句无论是否发生异常,都将执行最后的代码。

注意:可以使用except语句或者finally语句,但是两者不能同时使用。else语句也不能与finally语句同时使用。

一个异常可以是一个字符串、类或对象。Python的内核提供的异常,大多数都是实例化的类。一个异常可以带上参数,作为输出的异常信息参数。可以通过except语句来捕获异常的参数,如下所示:

变量接收的异常值通常包含在异常的语句中。在元组的表单中,变量可以接收一个或者多个值。元组通常包含错误字符串、错误数字、错误位置。

可以使用raise语句自己触发异常。raise语法格式如下:

raise[Exception[,args[,traceback]]]

语句中Exception是异常的类型(例如,NameError),参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是“None”。最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。

用户通过创建一个新的异常类来自定义异常,程序可以命名它们自己的异常。异常应该是通过直接或间接的方式继承自Exception类。