Django 2.0 入门与实践
上QQ阅读APP看书,第一时间看更新

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