异常处理与断言
异常处理概述
发生异常一方面有时会是疏忽导致,但有时有些异常是不可避免的。此时可以对异常进行捕捉,防止程序终止。下面主要分为异常类型和异常捕获两部分说明。
异常类型
异常类型一般分为Python内置异常和用户自定义异常。
Python内置异常,其中BaseException是所有内置异常的基类,Exception是常规异常的基类。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块就可以使用异常。内置异常类的层次结构如下图:
用户自定义异常一般用于异常触发时输出更多信息,如下创建一个MyError的异常实例:
异常捕获
当发生异常时,我们需要对异常进行捕获,然后进行相应的处理。其中与异常相关的关键字主要包括:try/except、else、finally、raise、traceback。该语法异常处理规则是:
l 执行try语句。若该语句未发生异常,则执行else语句;若该语句发生异常,则执行跳转到第一个except语句。
l 如果第一个except语句与发生的异常匹配,则执行该except下的语句;如果第一个except语句与发生的异常不匹配,则跳转到下一个except语句。
l 直到有一个except语句与其匹配或者所有except语句均不与其异常匹配,此时跳转到finally语句。
l 无论try语句发生异常与否,只要存在finally语句,均会执行该finally语句。
下面依次进行介绍:
try/except结构
捕获指定异常
捕获多个异常
第一种方式是一个except同时处理多个异常:
第二种方式是多个except处理,区分优先级:
异常中的else
如果判断语句中未发生异常,此时会执行else语句内容。
异常中的finally
无论语句中是否发生异常都会执行finally部分代码。也就是说即使在前面语句发生异常,也会执行finally语句,执行完之后才会抛出异常。
raise主动触发异常
可以使用raise语句自己触发异常,语法格式为:
其中Exception是异常的类型;args是一个异常参数值,该值可选,如果不提供则默认为None;traceback是最终异常对象。
例子如下:
采用traceback模块查看异常(未成功)
Traceback对象可以跟踪到异常发生时的有关信息,用法为:
也可以将相关信息写入到文件中去:
断言概述
在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助。
python assert断言的作用
python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
assert断言语句的语法格式
assert语句用来声明某个条件是真的。
如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句。
当assert语句失败的时候,会引发一AssertionError。