python中的内置异常
1 关于异常
代码中遇到错误时会引发异常,python中有许多内置的异常类来表示某种具体异常,当然也可以自定义异常类,当异常未被捕获或处理时,代码会在引发异常处终止,并将异常信息显示在回溯信息中(tarceback)
如下
上面可在traceback中看到一些关于异常的具体信息,由于改异常未被捕获或处理,代码在异常
处就停止执行
2 python的内置异常
基础异常类
1)BaseException
在python中,所有的异常类都是BaseException的儿子 孙子、、、、,反正他是所有异常类的祖宗
2)Exception
所有非系统异常类都是从它这继承的。平时常见的异常类大多数都是从它这里来的。如ValueError ZeroDivisionError等等
用户自定义的异常类也是从它这里继承
3)ArithmeticError
此基类用于派生针对各种算术类错误而引发的内置异常: OverflowError, ZeroDivisionError, FloatingPointError。
ArithmeticError也是从Exception那里继承下来的
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 的代码捕获
如下
当我按下ctrl+c引发KeyboardInterrupt,没有进入except语句,print()的代码未执行
写成 except Exception时,只会捕获Exception类型及它子类的异常。
如上,就可以捕获BaseException及其子类的异常
SystemExit
raise()
4 捕获异常
try/except 发生指定异常时,执行相应代码
用try/except语句捕获异常
如上,可以在except后面指定要捕获那些异常,一旦发生目标异常,就会执行对应的except子句的代码。
用except xxx as e,可以把异常信息存储在变量e中
在try语句中使用多个except
如上,也可以通过多个except来捕获多个异常
注意,之前说代码执行到异常发生出就会终止,之后的代码不会执行。这句话在try语句里面不成立
try语句就在发生指定异常后,接着去执行一些代码
在try中使用else子句,未发生异常时的情况执行相应代码
如上,注意是未发生异常执行esle子句。发生异常但是不属于except指定的异常,也不会进入else子句。 这点和if else 有点区别
在try中使用finally子句,无论是否发生异常都会执行的代码
在try语句中捕获异常后,抛出发生的异常
使用raise抛出异常
执行
对比看下,未抛出异常的情况
执行
注意,抛出异常时,显示出了tracebak,未抛出时,是没有traceback信息的
抛出异常时,除了finally子句,异常之后的代码是不会执行的,未抛出时,则是会执行的
except后面不指定具体的异常类
未指定的话,except会捕获所有的异常类