python中的内置异常

1 关于异常

代码中遇到错误时会引发异常,python中有许多内置的异常类来表示某种具体异常,当然也可以自定义异常类,当异常未被捕获或处理时,代码会在引发异常处终止,并将异常信息显示在回溯信息中(tarceback)
如下
image
上面可在traceback中看到一些关于异常的具体信息,由于改异常未被捕获或处理,代码在异常
处就停止执行

2 python的内置异常

基础异常类

1)BaseException

在python中,所有的异常类都是BaseException的儿子 孙子、、、、,反正他是所有异常类的祖宗

2)Exception

所有非系统异常类都是从它这继承的。平时常见的异常类大多数都是从它这里来的。如ValueError ZeroDivisionError等等
用户自定义的异常类也是从它这里继承

3)ArithmeticError

此基类用于派生针对各种算术类错误而引发的内置异常: OverflowError, ZeroDivisionError, FloatingPointError。
ArithmeticError也是从Exception那里继承下来的
image

4)LookupError

此基类用于派生当映射或序列所使用的键或索引无效时引发的异常: IndexError, KeyError。
它也是从Exception那里继承下来的

5)BufferError

当与缓冲区相关的操作无法执行时将被引发

3 一些具体的异常

AssertionError
AttributeError
IndexError
ZeroDivisionError
ValueError
OSError
KeyboardInterrupt
SystemExit
GeneratorExit
等等
参见 https://docs.python.org/3.8/library/exceptions.html#BaseException

KeyboardInterrupt

当用户按下中断键 (通常为 Control-C 或 Delete) 时将被引发。 在执行期间,会定期检测中断信号。 该异常继承自 BaseException 不会被处理 Exception 的代码捕获
如下
image
当我按下ctrl+c引发KeyboardInterrupt,没有进入except语句,print()的代码未执行
写成 except Exception时,只会捕获Exception类型及它子类的异常。

image
如上,就可以捕获BaseException及其子类的异常

SystemExit

raise()

4 捕获异常

try/except 发生指定异常时,执行相应代码

用try/except语句捕获异常
image
如上,可以在except后面指定要捕获那些异常,一旦发生目标异常,就会执行对应的except子句的代码。
用except xxx as e,可以把异常信息存储在变量e中

在try语句中使用多个except

image
如上,也可以通过多个except来捕获多个异常

注意,之前说代码执行到异常发生出就会终止,之后的代码不会执行。这句话在try语句里面不成立
try语句就在发生指定异常后,接着去执行一些代码

在try中使用else子句,未发生异常时的情况执行相应代码

image
如上,注意是未发生异常执行esle子句。发生异常但是不属于except指定的异常,也不会进入else子句。 这点和if else 有点区别

在try中使用finally子句,无论是否发生异常都会执行的代码

image

在try语句中捕获异常后,抛出发生的异常

使用raise抛出异常
image

执行
image

对比看下,未抛出异常的情况
image

执行
image

注意,抛出异常时,显示出了tracebak,未抛出时,是没有traceback信息的
抛出异常时,除了finally子句,异常之后的代码是不会执行的,未抛出时,则是会执行的

except后面不指定具体的异常类

image
未指定的话,except会捕获所有的异常类

posted @ 2023-05-11 22:22  工作手记  阅读(213)  评论(0编辑  收藏  举报