Python 内置异常
目录
1 简介
异常处理 是一个很重要的功能, 然而, 我平时往往会因为不知道可能触发的异常类型而直接对所有异常进行处理。 这样虽然让程序运行了起来, 但是很明显,这样做是不合适的。
所以, 准备通过官方文档来了解内置的异常类型。
2 常见异常
网上有人总结了 Python
的常见异常, 这里记录下来:
异常 | 描述 |
---|---|
AssertionError |
assert 语句失败 |
AttributeError |
试图访问一个对象没有的属性 |
IOError |
输入/输出异常, 基本上是无法打开文件。 |
ImportError |
无法引入模块或者包, 基本上是路径问题 |
IndentationError |
语法错误, 代码没有正确对齐 |
IndexError |
下标索引超出序列边界, 比如当 l 只有三个元素, 却试图访问 l[5] |
KeyError |
试图访问字典里不存在的键 |
KerboardInterrupt |
Ctrl + C 被按下 |
NameError |
使用一个还未被赋值予对象的变量 |
SyntaxError |
Python 代码非法, 代码不能解释 |
TypeError |
传入对象类型与要求的不符 |
UnboundLocalError |
试图访问一个还未被设置的局部变量, 基本上是由于另一个同名的全局变量,导致你以为正在访问它 |
ValueError |
传入一个调用者不期望的值, 即使值的类型是正确的 |
3 自定义异常
定义自己的异常是很有用的, 能够提供更清楚的 异常信息, 也能添加内置异常不具有的功能。
首先, 自定义异常类应该总是继承自内置的 Exception
类,或者是继承自那些本身就是从 Exception
继承而来的类。
既然自定义异常类继承自 Exception
, 那么应该先了解一下 Exception
的内容:
>>> help(Exception) Help on class Exception in module builtins: class Exception(BaseException) | Common base class for all non-exit exceptions. | | __init__(self, /, *args, **kwargs) | Initialize self. See help(type(self)) for accurate signature.
这里截取了一部分 Exception
的帮助文档, 可以看到, Exception
的参数包含:
*args
, **kwargs
.
先来测试一下这些参数的作用:
>>> raise Exception('exception') Traceback (most recent call last): File "<stdin>", line 1, in <module> Exception: exception >>> raise Exception('exception', 2) Traceback (most recent call last): File "<stdin>", line 1, in <module> Exception: ('exception', 2) >>> raise Exception('exception', 2, name='Test') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: exceptions.Exception does not take keyword arguments
这是测试过程, 很明显, Exception
可以接受任意数量的 位置参数, 而 关键字 参数不会被使用。
同时, 所有的参数会保存在名为 args
元组中:
>>> try: ... raise Exception(1, 2, 3) ... except Exception as ex: ... print(ex.args) ... (1, 2, 3)
现在, 可以来定义自己的异常了。
class MyException(Exception): """ My Exception.""" def __init(self, message, status, more=None): Exception.__init__(self, message, status, more) self.message = message self.status = status
一个简单的自定义异常, 包含了 message
及 status
属性。还有 more
参数, 可以通过 args
属性获取其值。
这样, 当遇到 MyException
时的处理方式可以更加丰富:
try: ... except MyException as ex: if ex.status > 500: print(ex.message)
4 Python2 内置异常
4.1 完整异常列表
- BaseException – 所有内建的异常的基类
- SystemExit – 由
sys.exit()
函数引发此异常。如果不处理这个异常,Python
解释器退出 - KeyboardInterrupt – 当用户按下中断键(通常是
Ctrl-C
或Delete
)时引发 - GeneratorExit – 当调用一个
generator
对象的close()
方法时引发 - Exception – 所有内建的、非系统退出的异常,都是从该类派生的。此外, 应该从该类派生所有用户定义的异常
- StopIteration – 当一个
iterator
的next()
方法发出信号, 表示没有更多的值时引发 - StandardError – 除
StopIteration
,GeneratorExit
,KeyboardInterrupt
和SystemExit
以外的所有内建异常的基类- BufferError – 当
buffer
相关的操作无法执行时引发 - ArithmeticError – 各种算术错误引发的内建异常的基类
- FloatingPointError – 当浮点数操作失败时引发
- OverflowError – 当要表示算术运算的结果太大时引发, 长整型不会引发该异常
- ZeroDivisionError – 当除法或取模运算的第 2 个参数为 0 时引发
- AssertionError – 当
assert
语句失败时引发 - AttributeError – 当属性引用或赋值失败时引发。当对象根本不支持属性引用或属性赋值时,将引发
TypeError
- EnvironmentError –
Python
系统以外发生的异常的基类- IOError – 当一个
I/O
操作, 由于I/O
相关原因导致失败时(未找到文件 或 磁盘已满) - OSError – 当一个函数返回系统相关的错误时引发
- WindowsError – 当
Windows
特定的错误发生时, 或者当错误号码与errno
值不对应时引发。 - VMSError – 仅在
VMS
上可用。当发生VMS
特定错误时引发
- WindowsError – 当
- IOError – 当一个
- EOFError – 当内建函数
input()
或raw_input()
的其中之一,在触及文件结尾 (EOF
) 情形,而没有读取到任何数据时引发 - ImportError – 当
import
语句无法找到模块定义,或者当from ... import
语句未能找到要导入的名称时引发 - LookupError – 当用于映射或序列的键或索引无效时引发的异常的基类
- IndexError – 当序列下标超出取值范围时引发。(切片索引会被静默地截取到允许范围内;如果索引不是一个普通整数,则引发
TypeError
) - KeyError – 当在现有键的集合中找不到映射的键时引发
- IndexError – 当序列下标超出取值范围时引发。(切片索引会被静默地截取到允许范围内;如果索引不是一个普通整数,则引发
- MemoryError – 当一个操作将内存耗尽,但情况仍可挽救时(通过删除某些对象)时引发
- NameError – 当找不到本地或全局名称时引发
- UnboundLocalError – 当引用函数或方法局部变量,但变量没有绑定值时引发
- ReferenceError – 当用一个由
weakref.proxy()
函数创建的弱引用代理,去访问引用者的属性,而该引用者已经被垃圾回收时,会引发此异常 - RuntimeError – 当检出错误不属于任何其它类别时引发
- SyntaxError – 当解析器遇到语法错误时引发
- IndentationError – 与不正确的缩进相关的语法错误的基类
- TabError – 当缩进中包含对制表符和空格的混用时引发
- IndentationError – 与不正确的缩进相关的语法错误的基类
- SystemError – 当解释器发现内部错误,但情况并没有看起来那么严重,不至于到要放弃所有希望的地步,此时会引发本异常
- TypeError – 当操作或函数应用于不合适类型的对象时引发
- ValueError – 当内建操作或函数,接收到类型正确,但值不正确的参数,而且这种情况不能用诸如
IndexError
这样的更精确的异常进行描述时引发- UnicodeError – 当有关
Unicode
编码或解码错误出现时引发- UnicodeDecodeError – 当解码过程中出现的一个
Unicode
相关的错误时引发 - UnicodeEncodeError – 当编码过程中出现的一个
Unicode
相关的错误时引发 - UnicodeTranslateError – 当翻译过程中出现的一个
Unicode
相关的错误时引发
- UnicodeDecodeError – 当解码过程中出现的一个
- UnicodeError – 当有关
- BufferError – 当
- Warning – 警告类别基类
- DeprecationWarning – 弃用特性警告基类
- PendingDeprecationWarning – 将来会被弃用特性的警告基类
- RuntimeWarning – 可疑
Runtime
行为警告基类 - SyntaxWarning – 可疑句法警告基类
- UserWarning – 用户代码生成警告基类
- FutureWarning – 将来会改变语义结构的警告基类
- ImportWarning – 可能弄错模块导入警告基类
- UnicodeWarning –
Unicode
相关的警告基类 - BytesWarning
- StopIteration – 当一个
- SystemExit – 由
4.2 异常层次结构
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError | +-- BufferError | +-- ArithmeticError | | +-- FloatingPointError | | +-- OverflowError | | +-- ZeroDivisionError | +-- AssertionError | +-- AttributeError | +-- EnvironmentError | | +-- IOError | | +-- OSError | | +-- WindowsError (Windows) | | +-- VMSError (VMS) | +-- EOFError | +-- ImportError | +-- LookupError | | +-- IndexError | | +-- KeyError | +-- MemoryError | +-- NameError | | +-- UnboundLocalError | +-- ReferenceError | +-- RuntimeError | | +-- NotImplementedError | +-- SyntaxError | | +-- IndentationError | | +-- TabError | +-- SystemError | +-- TypeError | +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning
5 Python3 内置异常
Python3
和 Python2
不兼容, 异常处理方面, Python3
也对异常结构进行了一些调整。
- 移除了
StandardError
, 继承自StandardError
的异常变为继承自Exception
OSError
直接继承自Exception
并且极大的扩充的子类的数量, 对异常情况可以更细致的处理- 所有警告现在都继承自
Warning
- more…
5.1 完整异常列表
- BaseException – 所有内建的异常的基类
- SystemExit – 由
sys.exit()
函数引发此异常。如果不处理这个异常,Python
解释器退出 - KeyboardInterrupt – 当用户按下中断键(通常是
Ctrl-C
或Delete
)时引发 - GeneratorExit – 当调用一个
generator
对象的close()
方法时引发 - Exception – 所有内建的、非系统退出的异常,都是从该类派生的。此外, 应该从该类派生所有用户定义的异常
- StopIteration – 当一个
iterator
的next()
方法发出信号, 表示没有更多的值时引发 - StopAsyncIteration
- ArithmeticError – 各种算术错误引发的内建异常的基类
- FloatingPointError – 当浮点数操作失败时引发
- OverflowError – 当要表示算术运算的结果太大时引发, 长整型不会引发该异常
- ZeroDivisionError – 当除法或取模运算的第 2 个参数为 0 时引发
- AssertionError – 当
assert
语句失败时引发 - AttributeError – 当属性引用或赋值失败时引发。当对象根本不支持属性引用或属性赋值时,将引发
TypeError
- BufferError – 当
buffer
相关的操作无法执行时引发 - EOFError – 当内建函数
input()
或raw_input()
的其中之一,在触及文件结尾 (EOF
) 情形,而没有读取到任何数据时引发 - ImportError – 当
import
语句无法找到模块定义,或者当from ... import
语句未能找到要导入的名称时引发- ModuleNotFoundError – 导入的模块不存在
- LookupError – 当用于映射或序列的键或索引无效时引发的异常的基类
- IndexError – 当序列下标超出取值范围时引发。(切片索引会被静默地截取到允许范围内;如果索引不是一个普通整数,则引发
TypeError
) - KeyError – 当在现有键的集合中找不到映射的键时引发
- IndexError – 当序列下标超出取值范围时引发。(切片索引会被静默地截取到允许范围内;如果索引不是一个普通整数,则引发
- MemoryError – 当一个操作将内存耗尽,但情况仍可挽救时(通过删除某些对象)时引发
- NameError – 当找不到本地或全局名称时引发
- UnboundLocalError – 当引用函数或方法局部变量,但变量没有绑定值时引发
- OSError
- BlockingIOError – 当一个操作阻塞一个设置为非阻塞操作的对象(例如套接字)时引发
- ChildProcessError – 在对子进程执行操作失败时引发
- ConnectionError – 连接相关问题的基类
- BrokenPipeError – 当试图在管道上写入而另一端已关闭时尝试写入,或试图写入已关闭写入的套接字时引发
- ConnectionAbortedError – 当连接尝试被同伴中止时引发
- ConnectionRefusedError – 当连接尝试被同伴拒绝时引发
- ConnectionResetError – 当连接被同伴重置时引发
- FileExistsError – 尝试创建已存在的文件或目录时引发
- FileNotFoundError – 当请求文件或目录但不存在时引发
- InterruptedError – 当系统调用被传入信号中断时引发
- IsADirectoryError – 在目录上请求文件操作时引发
- NotADirectoryError – 当目录操作被请求的目录不是目录时引发
- PermissionError – 当尝试运行没有足够访问权限的操作时引发
- ProcessLookupError – 当一个给定的过程不存在时引发
- TimeoutError – 当系统功能在系统级别超时时引发
- ReferenceError – 当用一个由
weakref.proxy()
函数创建的弱引用代理,去访问引用者的属性,而该引用者已经被垃圾回收时,会引发此异常 - RuntimeError – 当检出错误不属于任何其它类别时引发
- NotImplementedError
- RecursionError
- SyntaxError – 当解析器遇到语法错误时引发
- IndentationError – 与不正确的缩进相关的语法错误的基类
- TabError – 当缩进中包含对制表符和空格的混用时引发
- IndentationError – 与不正确的缩进相关的语法错误的基类
- SystemError – 当解释器发现内部错误,但情况并没有看起来那么严重,不至于到要放弃所有希望的地步,此时会引发本异常
- TypeError – 当操作或函数应用于不合适类型的对象时引发
- ValueError – 当内建操作或函数,接收到类型正确,但值不正确的参数,而且这种情况不能用诸如
IndexError
这样的更精确的异常进行描述时引发- UnicodeError – 当有关
Unicode
编码或解码错误出现时引发- UnicodeDecodeError – 当解码过程中出现的一个
Unicode
相关的错误时引发 - UnicodeEncodeError – 当编码过程中出现的一个
Unicode
相关的错误时引发 - UnicodeTranslateError – 当翻译过程中出现的一个
Unicode
相关的错误时引发
- UnicodeDecodeError – 当解码过程中出现的一个
- UnicodeError – 当有关
- Warning – 警告类别基类
- DeprecationWarning – 弃用特性警告基类
- PendingDeprecationWarning – 将来会被弃用特性的警告基类
- RuntimeWarning – 可疑
Runtime
行为警告基类 - SyntaxWarning – 可疑句法警告基类
- UserWarning – 用户代码生成警告基类
- FutureWarning – 将来会改变语义结构的警告基类
- ImportWarning – 可能弄错模块导入警告基类
- UnicodeWarning –
Unicode
相关的警告基类 - BytesWarning
- ResourceWarninf
- StopIteration – 当一个
- SystemExit – 由
5.2 异常层次结构
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- BufferError +-- EOFError +-- ImportError | +-- ModuleNotFoundError +-- LookupError | +-- IndexError | +-- KeyError +-- MemoryError +-- NameError | +-- UnboundLocalError +-- OSError | +-- BlockingIOError | +-- ChildProcessError | +-- ConnectionError | | +-- BrokenPipeError | | +-- ConnectionAbortedError | | +-- ConnectionRefusedError | | +-- ConnectionResetError | +-- FileExistsError | +-- FileNotFoundError | +-- InterruptedError | +-- IsADirectoryError | +-- NotADirectoryError | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError +-- RuntimeError | +-- NotImplementedError | +-- RecursionError +-- SyntaxError | +-- IndentationError | +-- TabError +-- SystemError +-- TypeError +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning +-- ResourceWarning