Python的异常处理机制

程序在运行时难免会因为各种“意外因素”或程序本身的逻辑问题导致出错,严重时这将使程序彻底崩溃。解决这些问题常规的思路就是增加大量的逻辑判断语句来消灭种种可能引起问题的“意外因素”,但这无疑会使程序代码变得复杂而庞大,并且十分脆弱。有没有更好的解决办法呢?如果没有的话也不会有你看到的这篇文章了,哈哈哈~

可以在错误(Python中称之为“异常”)产生时捕获异常,并按照给定的异常恢复代码尝试恢复异常。当然,如果你不捕获异常,那么当异常发生时,程序就必死无疑了。

先来看一个小程序。

给出一个文本文件“file.txt”,文件内容如下所示。要求:利用Python字符串的split()方法来分别获取每行字符串中”:”两边的字符,以第一行字符串为例,要求最终输出为此形式:aa said: aaa

aa:aaa
bb:bbb
(ccc)
dd:ddd
ee:eee
ff:fff:fff

编写程序如下。

file_data = open('file.txt','r',encoding='UTF-8')        #打开"file.txt"文件
for i in file_data:                 #利用for循环迭代读取"file.txt"文件的内容
    (a,b) = i.split(':',1)          #利用字符串的split()方法,以":"为切割条件(只切割一次),对每行字符串进行分割操作,最后将生成的列表中的两个元素分别赋值给变量a、b。
    print(a,end = '')               #输出变量a
    print(' said: ',end = '')       #输出字符串" said "
    print(b,end = '')               #输出变量b
file_data.close()                   #关闭文件

看似程序的逻辑上是没有问题的,但是运行后会发现Python的解释器抛出了如下异常。

aa said: aaa               #按照程序中预设的逻辑正确输出了处理后的字符串
bb said: bbb               #正确输出
Traceback (most recent call last):      #抛出了一个Traceback类型的异常!!!
 File "./a.py", line 5, in <module>
 (aa,bb) = i.split(':',1)
ValueError: not enough values to unpack (expected 2, got 1)

上面的异常的内容大致是:没有足够的值来赋给变量,应该有两个值,但现在只有一个。

查看”file.txt”文件的内容,可以发现,第三行的内容是:

(ccc)

这个字符串中没有包含“:”,理所当然的,split()方法并没有将其切割为列表的两个元素,所以在赋值时就产生了错误。

解决这个错误可以用逻辑判断语句来针对特定的场景给出特定的解决方法(预防异常产生),如下:

file_data = open('file','r',encoding='UTF-8')
for i in file_data:
    if not i.find(':') == -1:        #增加一个判断,只有当字符串中包含“:”字符时才执行相关语句。
        (aa,bb) = i.split(':',1)
        print(a,end = '')
        print(' said: ',end = '')
        print(b,end = '')
file_data.close()

这种方法虽然能解决问题,但需要对每一种可能出现的错误情况给出特定的逻辑判断语句及其他程序代码才能避免异常,这样做的弊端是显而易见的,毕竟且不论编写这样的代码有多么繁琐,光是考虑日后维护代码的工作量就已经令人窒息。

下面来看另一种解决方法:利用异常处理来解决此问题(允许异常产生,但会捕获异常并进行修复)。

file_data = open('file','r',encoding='UTF-8')
for i in file_data:
    try:             #捕获异常
        (a,b) = i.split(':',1)
        print(a,end = '')
        print(' said: ',end = '')
        print(b,end = '')
    except:          #给出修复异常的程序代码
        continue     #跳过本次循环
file_data.close()

程序正确执行并给出如下输出:

aa said: aaa
bb said: bbb
dd said: ddd
ee said: eee
ff said: fff:fff

异常处理的工作原理就是像文章开头说的那样,捕获一个异常,然后按照给定的恢复的代码来尝试恢复异常,就这么简单。

上边的例子中,我们捕获了全部的异常,并对所有的异常应用了同一段恢复代码,那该如何针对某一类型的异常执行某一特定的恢复代码呢?

可以这样写,这里只对IOError类型的错误应用恢复代码:

try :
    ...
except IOError:
    ...

以上介绍的就是Python的异常处理机制是简单用法,异常处理的好处就是可以让你能更加专注实现程序本身的功能,而不必费时费力的预先考虑各种可能产生的错误并写出预防错误的相应的逻辑判断及额外代码。