6.3 异常处理
了解了Python中的错误与异常之后,就需要掌握如何处理异常。
对于第一类语法错误,只能通过提高自身能力水平来避免。对于第二类异常,Python提供了try-except语法来处理。
还是以除数为0的情况为例,编写程序,通过添加try-except语法捕捉并处理异常:
def division (a, b): try: return a / b except ZeroDivisionError: print("除数不能是0")
调用division方法:
>>> c = division(5, 0)
输出:
除数不能是0
此时虽然除数为0,但是应用程序并没有崩溃而且还输出了比较友好的信息。
Try-except的工作原理如下:
(1)Try-except中的代码会被正常执行;
(2)如果没有出现异常则跳过except代码块并结束try-except;
(3)如果try-except中的某一句代码出现了异常情况,剩余的代码将不会执行,如果出现的异常与except所指定的异常一致,则执行except中的代码块,异常处理结束整个应用程序继续执行;
(4)如果出现的异常与except中所指定的异常不匹配,那么代码跳出try语句,程序继续抛出异常并终止执行。
一般来说,一个代码块可能会出现不止一种异常情况,此时可以将所有异常写在except语句中,形式如下:
except (RuntimeError, TypeError, NameError): pass
此时只要捕捉到异常列表中的任意一种异常都会进入except处理代码块进行处理。
如果想对每一种异常都进行个性化的处理,也可以将except拆分开来,修改上面代码加入更多异常处理情况:
调用division方法:
>>> c = division(5, 'a')
输出:
参数类型错误
注意,Python中的异常类型是有继承关系的,关于类的集成会在后面章节详细介绍。在这里只要知道如果后面except所指定的异常继承自前面异常的话,后面的异常也会被捕捉到。看下面的例子:
代码执行输出:
B C D
如果将except的顺序颠倒过来,将只会输出B,这是由于异常C和D都继承自异常B,所以第一次捕捉到B异常后就会终止执行:
此时读者可能会想,代码开发中的异常有很多,如果都像这样将每一种异常都提取出来,将会是一个很大的工作量而且也并不需要这样做,此时可以在最后一个except中不设置异常类型,这样最后一个except就会捕获所有前面没有指定的异常,如:
最后一个except将会捕获除ZeroDivisionError和TypeError之外的所有异常。
try-except语法还有一个重要功能:else。else语句是用来执行一些额外操作的,如try代码块中执行了一些文件操作,在else里面可以释放资源,else的语法格式如下:
最后需要了解的是Python代码可以操作异常,形式如下:
调用division方法:
>>> c = division(5, 0)
输出:
除数不能是0: division by zero