在Python程序执行过程中发生的异常可以通过try语句来检测,可以把需要检测的语句放置在try块里面,try块里面的语句发生的异常都会被try语句检测到,并抛出异常给Python解释器,Python解释器会寻找能处理这一异常的代码,并把当前异常交给其处理。这一过程称为捕获异常。如果Python解释器找不到处理该异常的代码,Python解释器会终止该程序的执行。
try语句有两种形式:一种是try—except;一种是try—finally。也可以是try—except—finally的组合。一个try语句可以对应一个或多个except语句,但只能对应一个finally子句。finally子句的作用是不管异常有没有发生,该语句块的代码都会被执行。这样就可以把一些不管异常有没有发生,都必须要执行的代码放置到finally子句块中。
使用try—except的语法规则如下:
我们用一个例子来说明try—except是如何工作的。案例程序很简单,要求用户输入一个数字,然后把用户输入的数字输出到屏幕上。为了更好说明try—except捕获异常的作用,下面的代码没有使用try—except语句。
当用户输入的不是数字时,上面的程序将会引发ValueError异常,程序被终止。如下图所示。
我们当然不希望发生上面的异常,但又无法预防用户输入错误的数据。在这种情况下,可以使用try—except语句来捕获因用户输入错误的数据而发生的异常,然后对异常进行处理就可以了。
上面的代码添加了try—except语句,用于对异常进行处理。把需要检测发生异常的语句放置在try子句块中,把需要处理异常的语句放置在except子句块中。except后面的ValueError是Python提供的标准异常名称,当传入函数的参数无效时,该异常被抛出。Python提供了几十个标准异常名称,用于处理在不同情况下发生的异常。
当不清楚异常需要使用哪个标准异常名称时,可以直接使用BaseException异常名称或Exception异常名称,BaseException异常是所有异常的基类,Exception异常是常规错误的基类。下表列出了Python提供的标准异常的名称。
表格1 Python提供的标准异常名称列表
try语句块的任何一条语句抛出异常时,后面的语句将不再执行,此时的控制权已经移交给except语句块。但在一些特殊情况下,这样的处理方式会存在一些问题,例如在一段打开文件并写入数据到文件的代码中,对文件的打开、写入、关闭等操作代码都放置在try语句块中,当执行写入文件的操作抛出异常时,后面关闭文件的语句将不会被执行,从而导致一些系统资源不能被及时释放。在这样的情况下,可以使用finally子句来解决这些问题。
在上面的代码中,文件关闭语句被放置在finally语句块中,不管try语句块中代码是否发生异常,打开的文件都将会关闭。