持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 异常类
在java中有全局异常处理,如下图,而在python中也有,提供一个BaseException类,它的子类都是异常类。
如下图,Exception调用mro,确实是Baseexception的子类。
在来看看常见的TypeError,继承的Exception。
自定义类(继承Exception),看报错也没问题的。
class customizeException(Exception):
pass
raise customizeException()
这里就和之前的try...except匹配特定的类型有关系了,如下抛出TypeError的异常,except后追加TypeError,就可以得到111,不同的异常由不同的except来处理。
try:
raise TypeError()
# raise Exception()
except TypeError:
# except Exception:
print(111)
这也验证了上面的说法。except后面跟个异常类,只捕获该异常,对其进行处理。
假如ValueError或者其他的类型,我无需一一判别,直接走异常处理,打印111即可,except 后面跟着个Exception即可,它可以捕获此类及子类的异常。在回想下刚才的mro,是不是就理顺了。
try:
# raise TypeError()
raise ValueError()
# raise Exception()
# except TypeError:
except Exception:
print(111)
有的时候呢,处理的异常较多,怎么办,如下图,多加几个except 异常类,在最后加个except Exception,你可以把它想像成switch语法,或者if语法,如果它等于这个异常类执行,elif 它等于某个异常类,最后的exception,就相当于最终的else语句,类似如下伪代码。
if ex == TypeError:
处理
elif ex == ValueError:
处理
else:
Exception处理
它们的放置规则就是,越是特别的异常类,越要放在前面,越普通的越放后面,Exception属于平平无奇,放在最后。还有raise抛出的是个实例。
2 总结
我们经常遇到这种情况,我想用except后面的异常类,可以用
as 别名,有点sql里的那个as,这里的别名,它就是实例。