语法错误在代码运行之前必须手动解决, 否则代码无法运行. 这个不是我们要讨论的内容.

但是一些异常只有在特定的情况下才会发生, 程序必须有自动处理异常的能力.

下面就讨论如何处理运行时异常.

python 提供了使用try...except...机制来处理异常.


try...except...基本使用

语法:

try:
    # python有可能出现异常的语句

except: 异常类型:
    # 出现异常时的处理语句

需求:

我们需要从键盘输入一个整数, 如果输入的不是整数就一直输入下去.

while True:
    try:
        x = int(input("请输入一个整数:"))
        break
    except ValueError:
        print("你输入的不是一个整数, 请重新输入!")


print("你输入的整数是:", x)

执行流程说明:

  1. 循环执行之后, 首先执行try语句.(就是指的Tryexcept之间的语句)

  2. 如果执行的过程中没有发生任何异常, 则会把Try语句执行完毕, 跳过except语句.

  3. 如果执行的过程中出现了异常, 出现异常语句后面的语句则不会再执行.

  4. 根据发生的异常类型去匹配except的后面的类型, 如果匹配成功, 则开始执行这个except语句


多个except语句

一个Try语句可以包含多个except语句, 每个except语句分别处理不同的异常, 但是至多只会有一个except语句执行.

while True:
    try:
        x = int(input("请输入一个整数:"))
        break
    except ValueError:
        print("你输入的不是一个整数, 请重新输入!")
    except TypeError:
        print("类型错误!")


print("你输入的整数是:", x)

一个except包含多个异常类型

一个except可以包含多个异常.

except (RuntimeError, TypeError, NameError):
    pass

except通配符

except也可以省略后面的异常名, 表示通配符. 如果前面的异常类都捕捉不到发生的异常,则这个异常就会起作用.

while True:
    try:
        x = int(input("请输入一个整数:"))
        print(x / 0)
        break
    except ValueError:
        print("你输入的不是一个整数, 请重新输入!")
    except:
        print("未知异常!")

print("你输入的整数是:", x)

else语句

python语言的异常处理相比其他语言一个特点是: 可以带有else语句.

else语句必须在所有的except语句之后.

当没有任何异常发生的时候, 会执行else语句.

while True:
    try:
        x = int(input("请输入一个整数:"))
    except ValueError:
        print("你输入的不是一个整数, 请重新输入!")
    except:
        print("未知异常!")
    else:
        print(x)
        break

使用 else 子句比在 try 子句中附加代码要好,因为这样可以避免 try ... except 意外的截获本来不属于它们保护的那些代码抛出的异常。


finally语句

还可以在最后添加一个可选的finally语句.

finally语句表示不管是否发生异常, 都会执行的语句.

finally必须添加在最后, 如果有else也要放在else的后面.

try:
    # a = 1 / 0
    pass
except ZeroDivisionError as exceptObj:
    print("except:发生异常的时候执行", exceptObj)
else:
    print("else:我在没有发生异常的时候执行")
finally:
    print("finally:我总是会执行")

由于finally语句不管是否发生异常总是执行, 所以finally语句中总是用作去释放已经打开的资源. 比如打开的文件, 应该在这里把文件关闭.


异常对象

在异常名之后, 也可以为except指定一个变量, 这个变量绑定产生的那个异常对象.

try:
    a = 1 / 0
except ZeroDivisionError as exceptObj:
    print(exceptObj)

Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-02-25 07:12:09

results matching ""

    No results matching ""