Python3.x的异常处理机制

Python的异常处理在Python3.x中相比Python2.x发生了一些值得关注的变化


辨析错误(Error)和异常(Exception)

错误:Python的语法错误也叫解析错

这里写图片描述

异常:Python程序在运行中出现的问题叫异常,或者运行时异常

Python3.x的异常处理机制_第1张图片

异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError;错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息


异常处理机制(Python3.x)

try-except语句处理异常

Python3.x的异常处理机制_第2张图片

try-except语句按照如下方式工作:
1)执行try子句(在关键字try和except之间的语句)
2)如果没有异常发生,忽略except子句,try子句执行后结束
3)如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略;如果异常的类型和excet之后的名称相符,那么对应的except子句将被执行;最后执行try语句之后的代码
4)如果一个异常没有与任何except匹配,那么这个异常将会传递给上层的try语句中

一个try语句可以包含多个except子句,分别用来处理特定的异常,但是最多只有一个except子句分支会被执行

一个except子句可以同时处理多个异常,这些异常将被放在圆括号里以元祖形式出现

except关键字后面甚至可以不加名称(当通配符使用)

另外,try-except语句还有一个可选的else子句,这个子句必须写在except子句之后,当且仅当try子句没有任何异常发生时执行(Phthonic的写法)

raise语句抛出异常

Python3.x的异常处理机制_第3张图片

raise关键字后面跟的是要被抛出的异常,它必须是一个异常实例或一个异常类(Exception子类)

如果指向知道知否抛出了一个异常而并不想处理它,那么后面不跟异常名的raise语句就可以再次把这个异常抛出

定制自己的异常类

可以通过创建一个新的Exception类来定制自己的的异常类

Python3.x的异常处理机制_第4张图片

当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类

大多数的异常的名字都以”Error”结尾,就跟标准的异常命名一样

finally语句清理异常

try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为

Python3.x的异常处理机制_第5张图片

Python3.x的异常处理机制_第6张图片

简而言之,finally语句就是用来做异常处理的扫尾工作的

不管try子句中到底有没有异常,finally子句都会执行

如果一个异常在try子句中(或者except和else子句中)被抛出,而没有任何的except把它截住,那么这个异常就会在fianly子句执行后再次被抛出

Python3.x的异常处理机制_第7张图片

和对象绑定的预定义清理行为

有些对象预定了一些标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行

Python3.x的异常处理机制_第8张图片

这段代码执行完后,就算读写文件出现了异常,(虽然没有使用finally子句来清理善后)也能自动关闭文件防止资源泄漏(Python的上下文管理器)

你可能感兴趣的:(Python,语言)