Python异常
马永亮python视频(56-59讲)笔记
目录
Python异常
python的运行时发生的错误称作异常
这个错误主要有两种类型:
- 语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译
- 逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成、计算或者输出结果需要的过程无法执行等
python异常是一个对象,表示错误或意外情况
在python检测到一个错误时,将触发一个异常
- python可以通过异常传递机制传递一个异常对象,发出一个异常情况出现的信号
- 程序员也可以在代码中手动触发异常
python异常可以理解为:程序出现了错误而在正常控制流以外采取的行为
- 第一阶段:解释器触发异常,此时当前程序流将被打断
- 第二阶段:异常处理,如忽略非致命性错误、减轻错误带来的影响等
(
## 我们需要对捕获的异常进行处理。如果没有做任何处理的话,这些异常会一直向上向上,直到python解释器,而解释器看到异常就会中止脚本执行,这种情况往往是我们不愿意看到的;
## 所以无论是哪种异常,都应该由程序员事先预想到,或者在程序内部有相关的处理操作;
## 程序员不能任由由于自己没有考虑到一些情况而导致异常发生,或者是用户输入了我们并不期望的数据导致异常发生时,而中止程序;
)
异常的功能
1、错误处理
- python的默认处理:停止程序,打印错误消息
- 使用 try 语句处理异常并从异常中恢复
2、事件通知
用于发出有效状态信号
(
## 一旦出现异常,就会由解释器触发一个信号通知给程序员;
## 不同的异常有不同的类型,通过这个信号可以了解到,到底在什么位置发生了什么样的错误;
)
3、特殊情况处理
无法调整代码去处理的场景
4、终止行为
try/finally 语句可确保执行必须的结束处理机制
5、非常规控制流程
异常是一种高级转跳(goto)机制——实现代码中的大跨度跳转
检测和处理异常
异常通过try语句来检测
任何在try语句块里的代码都会被监测,以检查有无异常发生
try语句主要有两种形式:
-
try-except:检测和处理异常
try后检测
except后处理
可以有多个 except
支持使用 else 子句处理没有探测异常的执行的代码 -
try-finally:仅检查异常并做一些必要的清理工作(如关闭文件或断开服务器连接等)
如果发现异常了,则对异常做一些收尾工作,不对异常本身做处理
仅能有一个finally
无论异常发生与否,finally子句都会执行
上述两种形式可以混合:
- try 语句的复合形式
try-except-finally
自定义异常——raise
raise语句可显式触发异常
(这是系统上不存在的,我们自行定义的异常)
格式为:
- raise [SomeException [, args [, traceback] ] ]
- SomeException:可选,异常的名字,仅能使用字符串、类或实例
- args:可选,以元组的形式传递给异常的参数
- traceback:可选,异常触发时新生成的一个用于异常-正常化的跟踪记录,多用于重新引发异常时
python异常对象
python异常是一个对象,是由内置的经典类——Exception类生成的对象,是这个类的子类的实例化
python2.5之后,Exception是从BaseException继承的新式类
也就是说,BaseException是所有异常的基类
大多的标准异常都是由StandarError派生的,其有3个抽象的子类:
- ArithmeticError:由于算术错误而引发的异常基类
例如:OverflowError,ZeroDivisionError,FloatingPointError - LookupError:容器在接收到一个无效键或索引是引发的异常的基类
例如:IndexError,KeyError - EnvironmentError:由于外部原因而导致的异常的基类
例如:IOError,OSError,WindowsError
Python的标准异常类
BaseException 是所有异常的基类;
Warning 是警告的基类
python中常用的标准异常类:
(按字母顺序排序)
异常名称 | 描述 |
---|---|
AssertionError | 断言语句失败 |
AttributeError | 属性引用或赋值失效,表示对象没有这个属性 |
FloatingPointError | 浮点型运算失败 |
IOError | I/O(输入/输出)操作失败 |
ImportError | import 语句不能找到要导入的模块,或者不能找到该模块特别请求的名称 |
IndentationError | 解析器遇到了一个由于错误的缩进而引发的语法错误 |
IndexError | 用来索引序列的整数超出了范围,序列中没有没有此索引(index) |
KeyError | 用来索引映射的键不在映射中 |
KeyboardInterrupt | 用户按了中断键(ctrl+c, ctrl+break 或 Delete键) |
MemoryError | 运算耗尽内存,内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性),引用了一个不存在的变量名 |
NotImplementedError | 由抽象基类引发的异常,用于指示一个具体的子类必须覆盖一个方法(表示尚未实现的方法) |
OSError | 由模块os中的函数引发的异常,用来指示平台相关的错误(操作系统错误) |
OverflowError | 数值运算超出最大限制,溢出 |
SyntaxError | 语法错误 |
SystemError | python本身或某些扩展模块中的内部错误(一般的解释器系统错误) |
TypeError | 对某对象执行了不支持的操作 |
UnboundLocalError | 引用未绑定值的本地变量(访问未初始化的本地变量) |
UnicodeError | 在Unicode的字符串之间进行转换时发生的错误 |
ValueError | 值错误,应用于某个对象的操作或函数,这个对象具有正确的类型,但确有不适当的值 |
WindowsError | 模块os中的函数引发的异常,用来指示与Windows相关的错误(系统调用失败) |
ZeroDivisionError | 除数或取模为0(所有数据类型) |
(其他来源)补充:
(按字母顺序排序)
异常名称 | 描述 |
---|---|
ArithmeticError | 所有数值计算错误的基类 |
BaseException | 所有异常的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
EnvironmentError | 操作系统错误的基类 |
EOFError | 没有内建输入,到达EOF 标记 |
Exception | 常规错误的基类 |
FutureWarning | 关于构造将来语义会有改变的警告 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
LookupError | 无效数据查询的基类 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
StandardError | 所有的内建标准异常的基类 |
StopIteration | 迭代器没有更多的值 |
SyntaxWarning | 可疑的语法的警告 |
SystemExit | Python 解释器请求退出 |
TabError | Tab 和空格混用 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
UserWarning | 用户代码生成的警告 |
自定义异常类
自定义异常和多重继承
- 较有效的方法是从自定义异常类和标准异常类进行多重继承,例如:
class CustomAttributeError(CustomException, AttributeError):
pass
标准库中使用的其它异常
- python标准库中的许多模块都定义了自己的异常类,如 socket 中的 socket.error
assert语句
assert 语句用于在程序中引入调试代码
assert condition [, expression ]
- 如果 condition 条件满足,assert 不做任何操作;
- 如果 condition 条件不满足,则 assert 使用 expression 作为参数实例化 AssertionError 并引发结果实例
注意如果运行python时使用了 -O 优化选项,则assert将是一个空操作,编译器不为 assert 语句生成代码
- 运行python时不使用 -O 选项,则
__debug__
内置变量为 True,否则其值为 False
assert 语句其实就相当于下面的代码:
if __debug__:
if not condition:
raise AssertionError, <expression>
(
## assert 会生成一个自定义的断言异常,
## 说白了就是一个简化版的自定义异常方式,
## 能够实现手动触发异常
)
(不官方)小结
python异常是一个由类生成的对象
python异常对象有很多种,但是都有一个共同的基类:BaseException
BaseException下面有3个抽象子类
每个抽象类内部有很多子的、常用的、真正的异常类
用户可以手动用 raise 触发异常(自定义异常)
不论哪一种异常都是可以进行捕获的
捕获或处理异常的两种方式:
- try-except
- try-finally
- 两者还可嵌套结合使用
raise 中还有一个特殊的方式:assert 断言,是个简化版的自定义异常的方式
--------本文完--------
附录:https://docs.python.org/zh-cn/3.7/library/asyncio-exceptions.html 异常-Python文档