python异常捕获
1、什么是异常
异常就是错误的发生的信号,如果此信号不做处理,那么,从本行开始之后的代码都不能正常执行了
如果发生了很多报错,直接看最后一个报错,最后一个一般可以找出直接报错原因,如果还是找不到,那就依次往上看两眼
错误总共分三类:
1、语法错误:是坚决不允许的,遇到之后要立即改正,否者,代码不能运行
语法错误会在python编辑器内通过红色波浪线标注在代码下
2、逻辑错误:是可以被允许的,但是我们写逻辑的时候要尽可能的避免逻辑错误的发生
程序运行结果和预期结果不一样,说明程序中存在逻辑错误,如运算符使用不正确,语句顺序不对,循环语句的起始值、终值或步长设置不对等。逻辑错误通常不会产生错误提示,只能根据运行结果知道程序中出现了错误。因此,这种错误较难被排除,需要仔细排查代码
逻辑上的错误
-
错误发生的条件是可以预知的 --> if判断
-
错误发生的条件是无法预知的 --> 异常捕获 try
3、运行错误:运行错误是指python代码编译通过,在运行代码时发生的错误
python程序运行之中出现的错误就会导致整个程序都停止运行,像是条件判断中符号左右两边数据类型不同、方法调用时的数据类型不同、打开的文件不存在以及索引越界和用0作为除数等等都是运行错误。而运行错误的特点就是无法被解析器找到,只有在运行时经过动态赋值才会出现。
Python全部的错误类型
错误类型——说明
ZeroDivisionError——除(或取模)零 (所有数据类型)
ValueError——传入无效的参数
AssertionError——断言语句失败
StopIteration——迭代器没有更多的值
IndexError——序列中没有此索引(index)
IndentationError——缩进错误
OSError——输入/输出操作失败
ImportError——导入模块/对象失败
NameError——未声明/初始化对象 (没有属性)
AttributeError——对象没有这个属性
GeneratorExit——生成器(generator)发生异常来通知退出
TypeError——对类型无效的操作
KeyboardInterrupt——用户中断执行(通常是输入^C)
OverflowError——数值运算超出最大限制
FloatingPointError——浮点计算错误
BaseException——所有异常的基类
SystemExit——解释器请求退出
Exception——常规错误的基类
StandardError——所有的内建标准异常的基类
ArithmeticError——所有数值计算错误的基类
EOFError——没有内建输入,到达EOF 标记
EnvironmentError——操作系统错误的基类
WindowsError——系统调用失败
LookupError——无效数据查询的基类
KeyError——映射中没有这个键
MemoryError——内存溢出错误(对于Python 解释器不是致命的)
UnboundLocalError——访问未初始化的本地变量
ReferenceError——弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError——一般的运行时错误
NotImplementedError——尚未实现的方法
SyntaxError Python——语法错误
TabError——Tab 和空格混用
SystemError——一般的解释器系统错误
UnicodeError——Unicode 相关的错误
UnicodeDecodeError——Unicode 解码时的错误
UnicodeEncodeError——Unicode 编码时错误
UnicodeTranslateError——Unicode 转换时错误
以下为警告类型
Warning——警告的基类
DeprecationWarning——关于被弃用的特征的警告
FutureWarning——关于构造将来语义会有改变的警告
OverflowWarning——旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning——关于特性将会被废弃的警告
RuntimeWarning——可疑的运行时行为(runtime behavior)的警告
SyntaxWarning——可疑的语法的警告
UserWarning——用户代码生成的警告
2、如果捕捉异常
如果我们想分别用不同的逻辑处理,需要用到多分支的except(类似于多分支的elif,从上到下依次匹配,匹配成功一次便不再匹配其他)
try: #异常的意思
子代码1# 有可能会抛出异常的代码
子代码2
子代码3
except 异常类型1 as e: # as语法将异常类型的值赋值给变量e,这样我们通过打印e便可以知道错误的原因
pass
except 异常类型2 as e:
pass
...
else:
如果被检测的子代码块没有异常发生,则会执行else的子代码
finally:
无论被检测的子代码块有无异常发生,都会执行finally的子代码
# try不能和else单独连用
# try 和 finally 连用,就算出了异常也先执行finally下代码块再抛出异常
如果我们想多种类型的异常统一用一种逻辑处理,可以将多个异常放到一个元组内,用一个except匹配。
try:
被检测的代码块
except (NameError,IndexError,TypeError):
触发NameError或IndexError或TypeError时对应的处理逻辑
如果我们想捕获所有异常并用一种逻辑处理,Python提供了一个万能异常类型 Exception
try:
被检测的代码块
except NameError:
触发NameError时对应的处理逻辑
except IndexError:
触发IndexError时对应的处理逻辑
except Exception:
其他类型的异常统一用此处的逻辑处理