本文将介绍异常的捕获和抛出
一、异常信息与内置异常类型
先来介绍几个单词:
trace:跟踪,追踪;back:返回
expect:除非;expection:例外,异议
1.Traceback异常信息
在python中,用traceback来显示出现异常(exception)时代码执行栈的情况。traceback由三部分组成:信息头,出错位置,异常信息。异常位置在最后,异常是按照调用顺序往回传播的,因此,出错位置的最后一条才是出错的真正位置。
其中异常信息最后一行的首个单词“ZeroDivisonError",代表着该异常的类型:一个除0错误
出错位置在“出错位置”信息部分的最后一行:line1 print(1/0)
2.内置异常类型
python的思想是什么?万物皆对象,这里的异常其实也是一个个类,既然是类,肯定有参数,肯定可以自定义。
(1)标准异常
所有的异常类都是从BaseExecption类继承来的。常用的异常类继承于Execption,当自定义异常类时,也要求从Execption继承而来。
python标准异常
异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
LookupError 无效数据查询的基类
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告ImportWarning
UnicodeWarning
Exception类下有30多种不同的异常类型,常见的异常类型有:
(1)LookupError下的IndexError和KeyError
这两个异常重要用在访问不存在的列表元素时抛出IndexError异常、访问字典不存在的Key值时抛出KeyError。
(2)IOError
当程序尝试写一个不存在的文件或者其他的IO错误时
(3)NameError
当尝试访问一个不存在的变量名称时
(4)TypeError
进行一个类型不支持的操作时
(5)AttributeError
当访问一个对象不存在的属性时。attribute的意思是 :
n.
- (人或物的)属性,特性,特征,品性,品质
- 标志,象征,表征
可以理解为“属性错误”
(6)ZeroDivisonError
被除数是0
二、捕获异常和多重异常处理
1.捕获异常
使用try...except语句,理解为:不确定以下语句一定没有错误,于是”尝试“执行。
try:
statements 1
except +错误类型
statements 2
当statements 1遇到错误抛出错误类型时,不会终止,而是except的错误类型对比,如果相同则执行statements 2。
这个过程称为“捕获到异常”
2.多重异常处理
及面对多种可能的异常抛出。这里我们给出完整的语句:
try:
statements 1
expect (异常类型1,异常类型2,异常类型3...)
statements 2
expect (异常类型4,异常类型5,异常类型6...)
statements 3
expect (异常类型7,异常类型8,异常类型9...)
statements 4
else:
statements 5
finally:
statements 6
- expcept后面可以只写一个错误类型,那样就不必用括号,也可以像这样写多个。
- 如果except后面什么都没有,则表示try抛出任何异常类型都按此执行。
- else后面的语句,将会在try语句顺利执行后执行
- finally后面的语句,则是不论try是否顺利执行,都将执行。
3.异常的参数
可以利用捕获异常的语句获得异常的信息参数:
try:
statementss 1
except +异常类型 as e:
print(e)
这样就输出了try抛出的异常的参数(往往是异常类型名)
4.自定义异常类
注意一点:一般声明自己定义的异常从Exception继承而来。
其余的,感兴趣可以查资料。
三、抛出异常
这里指的是“主动抛出异常”。
1.应用场景
什么时候需要主动抛出异常呢?————当输入不符合业务需求时。
举个例子,在登录qq时,密码输入错误,这个时候QQ的程序就会抛出异常,诸如此类的验证码错误,注册名不符合规范等等。
2.如何主动抛出异常
python提供了一个EXception异常类
在开发时,如果没有满足也无需求时,希望抛出异常,只需要:
- 创建一个Exception的对象(这个Exception对象也可以是Exception的诸多子类的对象)
- 使用raise关键字抛出异常对象
3.三种常用抛出异常的方法:
(1)raise后面接实例化对象
(2)raise后面接异常类名
(3)raise后面接异常类和类的初始化参数