• 《python学习手册》第32章 异常基础


    发生异常与默认的异常处理  

      当发生异常的时候,我们代码没有刻意捕获这个异常,所以它会一直向上返回到程序顶层,并启用默认的异常处理器:打印标准出错信息。而且会终止程序。
      执行下面程序
    def fun(a,b):
        return a[b]
    print(fun('nihao',20))

      会出现异常,异常信息一般是这样的

    Traceback (most recent call last):
      File "D:applicationeclipseworkspaceyichangc1	est1.py", line 8, in <module>
        print(fun('nihao',20))
      File "D:applicationeclipseworkspaceyichangc1	est1.py", line 7, in fun
        return a[b]
    IndexError: string index out of range

    捕获异常和异常恢复

      我们希望我们的代码更加的鲁棒,所以,我们希望我们的代码在发生异常的时候依然正常的进行,所以我们要进行异常捕获和处理,使用下面的代码
    def fun(a,b):
        return a[b]
    try:
        fun('nihao',20)
    except IndexError:
        print('nihao')

      运行以后的结果是: nihao 

      更一般的,我们希望后面的模块,当我们在后面写语句的时候,代码如下
    def fun(a,b):
        return a[b]
    try:
        fun('nihao',20)
    except IndexError:
        print('nihao')
    print('dajiahao')

      这个时候运行结果如下:

    nihao
    dajiahao 

      说明我们后面的代码能够正常运行。try代码块执行时触发异常,python会自动跳至处理器。处理以后,程序继续向后进行,这样当我们的代码出现异常的时候我们的程序就不会终止了。

     

    引发异常

      除了上面程序运行当中出现的异常,我们可以自己引发异常,比如使用raise

    try:
        raise IndexError
    except IndexError:
        print('got indexerror')

      运行结果如下: got indexerror 

      除了raise以外,assert可以用来触发异常--它是一个有条件的raise

     

    用户定义异常

      我们可以自己定义自己的异常类,通过继承一个内置的异常类,通常为Exception。基于类的异常允许脚本建立异常类型,继承行为以及附加状态信息。 例如,运行下面的代码:

    class Bad(Exception):
        pass
    try:
        raise Bad()
    except Bad:
        print('Bad Exception')

      将会得到结果: Bad Exception 

     

    终止行为

      在try后面除了跟except异常处理器以外,还可以跟finally,与except不同的是,可以定义一定会在执行时收尾的行为,无论try代码块中是否发生异常。

      当try代码块中有异常时:

    def fun(a,b):
        return a[b]
    try:
        fun('hello',20)
    finally:
        print('finally excute')
    print('fun excute?')

      执行的结果如下:

    finally excute
    Traceback (most recent call last):
      File "D:applicationeclipseworkspaceyichangc1finally.py", line 9, in <module>
        fun('hello',20)
      File "D:applicationeclipseworkspaceyichangc1finally.py", line 7, in fun
        return a[b]
    IndexError: string index out of range

      可以看到,try中发生异常,最终执行了finally里面的语句,但是try-finally之后的语句是不被执行的,这是因为,异常发生时,控制权在try-finally代码块后中断了。python跳回去执行finally的行为,然后把异常向上传播到前一个处理器(在这个例子中,为顶层的默认处理器)。

      当try代码块没有异常的时候:

    def fun(a,b):
        return a[b]
    try:
        fun('hello',3)
    finally:
        print('finally excute')
    print('fun excute?')

      运行结果如下:

    finally excute
    fun excute?

      可以看到,无论如何finally 里面的代码都会被执行。

      python还提供了一种try-finally的一种替代:with-as语句。


    总结一下:
      python里面的异常是一种高级控制流设备。可以由python引发,或者自己的程序引发。对于异常来说,可以忽略(以触发默认的出错消息),或者由try语句捕获(由你的代码处理)。try语句有两种逻辑形式,一种是处理异常(except),一种是不管是否发生异常都执行最终的代码块(finally)。python的raise和assert语句根据需要触发异常。with-as是一种替代方式,确保对它所支持的对象执行终结操作。
  • 相关阅读:
    【杭电】[2016]数据的交换输出
    【杭电】[2015]偶数求和
    【杭电】[2015]偶数求和
    【杭电】[2026]首字母变大写
    【杭电】[2026]首字母变大写
    【杭电】[2075]A|B?
    【杭电】[2075]A|B?
    【杭电】[2043]密码
    【杭电】[2043]密码
    SQL 06: 内连接 (多表查询)
  • 原文地址:https://www.cnblogs.com/jiaxin359/p/7299235.html
Copyright © 2020-2023  润新知