内置异常

在 Python 中,所有异常都必须是从 BaseException 派生的类的实例。在一个带有提及特定类的 except 子句的 try 语句中,该子句也会处理从该类派生的任何异常类(但不处理从 *它* 派生的异常类)。两个不通过子类化相关的异常类永远不会相等,即使它们具有相同的名称。

本章列出的内置异常可以由解释器或内置函数生成。除非另有说明,否则它们都有一个“关联值”,指示错误的详细原因。这可以是一个字符串,也可以是包含多个信息项的元组(例如,错误代码和解释该代码的字符串)。关联值通常作为参数传递给异常类的构造函数。

用户代码可以引发内置异常。这可以用来测试异常处理程序,或者报告“就像”解释器引发相同异常的情况一样的错误情况;但要注意,没有什么可以阻止用户代码引发不适当的错误。

可以对内置异常类进行子类化以定义新的异常;鼓励程序员从 Exception 类或其子类之一派生新的异常,而不是从 BaseException 派生。有关定义异常的更多信息,请参阅 Python 教程中的 用户定义的异常

异常上下文

异常对象上的三个属性提供了有关引发异常的上下文的信息

BaseException.__context__
BaseException.__cause__
BaseException.__suppress_context__

当在另一个异常已经被处理时引发新的异常时,新异常的 __context__ 属性会自动设置为被处理的异常。当使用 exceptfinally 子句或 with 语句时,可能会处理异常。

可以通过在 raise 中使用 from 来补充此隐式异常上下文和显式原因

raise new_exc from original_exc

from 后面的表达式必须是一个异常或 None。它将在引发的异常上设置为 __cause__。设置 __cause__ 也会隐式地将 __suppress_context__ 属性设置为 True,以便使用 raise new_exc from None 有效地将旧异常替换为新异常以用于显示目的(例如,将 KeyError 转换为 AttributeError),同时将旧异常保留在 __context__ 中,以便在调试时进行内省。

默认的回溯显示代码会显示这些链接的异常,以及异常本身的回溯。如果存在显式链接的异常(在 __cause__ 中),则始终会显示它。仅当 __cause__None__suppress_context__ 为 false 时,才会显示隐式链接的异常(在 __context__ 中)。

无论哪种情况,异常本身始终都会在任何链接的异常之后显示,以便回溯的最后一行始终显示引发的最后一个异常。

继承内置异常

用户代码可以创建继承自异常类型的子类。建议一次只继承一个异常类型,以避免基类如何处理 args 属性之间可能出现的任何冲突,以及由于可能的内存布局不兼容性。

**CPython 实现细节:** 大多数内置异常都是用 C 语言实现的,以提高效率,请参阅:Objects/exceptions.c。有些异常具有自定义内存布局,这使得无法创建继承自多个异常类型的子类。类型的内存布局是实现细节,可能会在 Python 版本之间发生变化,从而在未来导致新的冲突。因此,建议完全避免继承多个异常类型。

基类

以下异常主要用作其他异常的基类。

异常 BaseException

所有内置异常的基类。它不打算直接被用户定义的类继承(为此,请使用 Exception)。如果在此类的实例上调用 str(),则返回实例参数的表示形式,如果没有参数,则返回空字符串。

args

提供给异常构造函数的参数元组。一些内置异常(如 OSError)需要一定数量的参数,并为该元组的元素赋予特殊含义,而其他异常通常只使用一个字符串调用,该字符串提供错误消息。

with_traceback(tb)

此方法将 *tb* 设置为异常的新回溯,并返回异常对象。在 PEP 3134 的异常链接功能可用之前,它更常用。以下示例显示了如何在保留回溯的同时将 SomeException 的实例转换为 OtherException 的实例。引发后,当前帧将被推送到 OtherException 的回溯中,就像如果我们允许原始 SomeException 传播到调用者,则会发生在其回溯中一样。

try:
    ...
except SomeException:
    tb = sys.exception().__traceback__
    raise OtherException(...).with_traceback(tb)
__traceback__

一个可写字段,用于保存与此异常关联的 回溯对象。另请参阅:raise 语句

add_note(note)

将字符串 note 添加到异常的注释中,这些注释在异常字符串之后的标准回溯中显示。如果 note 不是字符串,则会引发 TypeError

3.11 版新增。

__notes__

此异常的注释列表,这些注释是使用 add_note() 添加的。此属性在调用 add_note() 时创建。

3.11 版新增。

exception Exception

所有内置的、非系统退出的异常都派生自此类。所有用户定义的异常也应该派生自此类。

exception ArithmeticError

为各种算术错误引发的内置异常的基类:OverflowErrorZeroDivisionErrorFloatingPointError

exception BufferError

当无法执行与 缓冲区 相关的操作时引发。

exception LookupError

当在映射或序列上使用的键或索引无效时引发的异常的基类:IndexErrorKeyError。这可以通过 codecs.lookup() 直接引发。

具体异常

以下异常是通常引发的异常。

exception AssertionError

assert 语句失败时引发。

exception AttributeError

当属性引用(请参阅 属性引用)或赋值失败时引发。(当一个对象根本不支持属性引用或属性赋值时,会引发 TypeError。)

nameobj 属性可以使用仅限关键字的参数设置给构造函数。设置后,它们分别表示尝试访问的属性的名称和为该属性访问的对象。

在 3.10 版更改: 添加了 nameobj 属性。

exception EOFError

input() 函数在没有读取任何数据的情况下遇到文件结束条件 (EOF) 时引发。(注意:io.IOBase.read()io.IOBase.readline() 方法在遇到 EOF 时返回一个空字符串。)

exception FloatingPointError

当前未使用。

exception GeneratorExit

生成器协程 关闭时引发;请参阅 generator.close()coroutine.close()。它直接继承自 BaseException 而不是 Exception,因为它在技术上不是错误。

exception ImportError

import 语句尝试加载模块遇到问题时引发。当 from ... import 中的“from 列表”具有无法找到的名称时,也会引发此异常。

可选的仅关键字参数 namepath 设置相应的属性

name

尝试导入的模块的名称。

path

触发异常的任何文件的路径。

在 3.3 版更改: 添加了 namepath 属性。

exception ModuleNotFoundError

ImportError 的子类,当 import 找不到模块时引发。当在 sys.modules 中找到 None 时,也会引发此异常。

3.6 版新增。

exception IndexError

当序列索引超出范围时引发。(切片索引会被静默截断以落在允许的范围内;如果索引不是整数,则会引发 TypeError。)

exception KeyError

在映射(字典)中找不到键时引发。

exception KeyboardInterrupt

当用户按下中断键(通常是 Control-CDelete)时引发。在执行过程中,会定期检查中断。该异常继承自 BaseException,以避免被捕获 Exception 的代码意外捕获,从而阻止解释器退出。

注意

捕获 KeyboardInterrupt 需要特别注意。因为它可以在不可预测的点引发,所以在某些情况下,它可能会使正在运行的程序处于不一致的状态。通常最好允许 KeyboardInterrupt 尽快结束程序或完全避免引发它。(请参阅 关于信号处理程序和异常的注意事项。)

exception MemoryError

当操作内存不足但情况仍可挽救(通过删除一些对象)时引发。关联的值是一个字符串,指示哪种(内部)操作内存不足。请注意,由于底层内存管理架构(C 的 malloc() 函数),解释器可能无法始终从此类情况下完全恢复;但它仍然会引发异常,以便可以打印堆栈回溯,以防万一是失控程序导致的。

exception NameError

当找不到本地或全局名称时引发。这仅适用于非限定名称。关联的值是一个错误消息,其中包含无法找到的名称。

name 属性可以使用仅关键字参数在构造函数中设置。设置后,它表示尝试访问的变量的名称。

在 3.10 版更改: 添加了 name 属性。

exception NotImplementedError

此异常派生自 RuntimeError。在用户定义的基类中,当抽象方法需要派生类重写该方法时,或者在开发类时指示仍需要添加实际实现时,应引发此异常。

注意

它不应该用于表示根本不支持某个运算符或方法——在这种情况下,要么将运算符/方法保留为未定义,要么(如果是子类)将其设置为 None

注意

NotImplementedErrorNotImplemented 不可互换,即使它们的名称和用途相似。有关何时使用它的详细信息,请参阅 NotImplemented

exception OSError([arg])
exception OSError(errno, strerror[, filename[, winerror[, filename2]]])

当系统函数返回系统相关错误时引发此异常,包括 I/O 错误,例如“文件未找到”或“磁盘已满”(不是针对非法参数类型或其他偶然错误)。

构造函数的第二种形式设置了相应的属性,如下所述。如果未指定,则属性默认为 None。为了向后兼容,如果传递了三个参数,则 args 属性仅包含前两个构造函数参数的 2 元组。

如下面的 操作系统异常 中所述,构造函数通常实际上返回 OSError 的子类。特定的子类取决于最终的 errno 值。此行为仅在直接或通过别名构造 OSError 时发生,并且在子类化时不会继承。

errno

来自 C 变量 errno 的数字错误代码。

winerror

在 Windows 下,这将为您提供本机 Windows 错误代码。然后,errno 属性就是该本机错误代码的近似翻译,用 POSIX 术语表示。

在 Windows 系统下,如果 winerror 构造函数参数是一个整数,则 errno 属性由 Windows 错误代码确定,并且 errno 参数将被忽略。在其他平台上,winerror 参数会被忽略,并且 winerror 属性不存在。

strerror

操作系统提供的相应错误消息。它由 POSIX 下的 C 函数 perror() 和 Windows 下的 FormatMessage() 格式化。

filename
filename2

对于涉及文件系统路径的异常(例如 open()os.unlink()),filename 是传递给函数的文件名。对于涉及两个文件系统路径的函数(例如 os.rename()),filename2 对应于传递给函数的第二个文件名。

在 3.3 版更改: EnvironmentErrorIOErrorWindowsErrorsocket.errorselect.errormmap.error 已合并到 OSError 中,并且构造函数可能会返回一个子类。

在 3.4 版更改: filename 属性现在是传递给函数的原始文件名,而不是编码为 文件系统编码和错误处理程序 或从其解码的名称。此外,还添加了 filename2 构造函数参数和属性。

异常 OverflowError

当算术运算的结果太大而无法表示时引发。这不会发生在整数上(它们宁愿引发 MemoryError 而不是放弃)。但是,由于历史原因,有时会在整数超出所需范围时引发 OverflowError。由于 C 语言中缺少浮点异常处理的标准化,因此不会检查大多数浮点运算。

异常 RecursionError

此异常派生自 RuntimeError。当解释器检测到超过最大递归深度(请参阅 sys.getrecursionlimit())时,会引发此异常。

3.5 版新增: 以前,会引发普通的 RuntimeError

异常 ReferenceError

当由 weakref.proxy() 函数创建的弱引用代理在引用对象被垃圾回收后用于访问其属性时,会引发此异常。有关弱引用的更多信息,请参阅 weakref 模块。

异常 RuntimeError

当检测到不属于任何其他类别的错误时引发。关联的值是一个字符串,指示具体出了什么问题。

异常 StopIteration

由内置函数 next()迭代器__next__() 方法引发,表示迭代器没有生成更多项。

value

异常对象只有一个属性 value,它在构造异常时作为参数给出,默认为 None

生成器协程 函数返回时,会引发一个新的 StopIteration 实例,并且函数返回的值将用作异常构造函数的 value 参数。

如果生成器代码直接或间接引发 StopIteration,它将被转换为 RuntimeError(保留 StopIteration 作为新异常的原因)。

在 3.3 版更改: 添加了 value 属性以及生成器函数使用它返回值的功能。

在 3.5 版更改: 通过 from __future__ import generator_stop 引入了 RuntimeError 转换,请参阅 PEP 479

3.7 版更改: 默认情况下为所有代码启用 PEP 479: 在生成器中引发的 StopIteration 错误会被转换为 RuntimeError

异常 StopAsyncIteration

必须由 __anext__() 方法引发,该方法属于 异步迭代器 对象,用于停止迭代。

3.5 版新增。

异常 SyntaxError(message, details)

当解析器遇到语法错误时引发。这可能发生在 import 语句中,在调用内置函数 compile()exec()eval() 时,或者在读取初始脚本或标准输入(也包括交互式)时。

异常实例的 str() 只返回错误消息。Details 是一个元组,其成员也可以作为单独的属性使用。

filename

发生语法错误的文件的名称。

lineno

文件中发生错误的行号。这是从 1 开始索引的:文件中的第一行的 lineno 为 1。

offset

行中发生错误的列。这是从 1 开始索引的:行中的第一个字符的 offset 为 1。

text

涉及错误的源代码文本。

end_lineno

文件中发生错误的行号结束于哪一行。这是从 1 开始索引的:文件中的第一行的 lineno 为 1。

end_offset

错误发生结束的行中的列。这是从 1 开始索引的:行中的第一个字符的 offset 为 1。

对于 f 字符串字段中的错误,消息前缀为“f-string: ”,并且偏移量是根据替换表达式构造的文本中的偏移量。例如,编译 f'Bad {a b} field' 会导致 args 属性为:('f-string: …', ('', 1, 2, '(a b)n', 1, 5))。

3.10 版更改: 添加了 end_linenoend_offset 属性。

异常 IndentationError

与不正确的缩进相关的语法错误的基类。这是 SyntaxError 的子类。

异常 TabError

当缩进包含不一致的使用制表符和空格时引发。这是 IndentationError 的子类。

异常 SystemError

当解释器发现内部错误,但情况看起来不那么严重以至于放弃所有希望时引发。关联的值是一个字符串,指示出现了什么问题(以低级术语表示)。

您应该向 Python 解释器的作者或维护者报告此问题。请务必报告 Python 解释器的版本(sys.version;它也会在交互式 Python 会话开始时打印)、确切的错误消息(异常的关联值),以及如果可能的话,触发错误的程序的源代码。

异常 SystemExit

此异常由 sys.exit() 函数引发。它继承自 BaseException 而不是 Exception,因此它不会被捕获 Exception 的代码意外捕获。这允许异常正确地向上抛出并导致解释器退出。当它没有被处理时,Python 解释器退出;不打印堆栈回溯。构造函数接受传递给 sys.exit() 的相同可选参数。如果该值为整数,则它指定系统退出状态(传递给 C 的 exit() 函数);如果它是 None,则退出状态为零;如果它是其他类型(例如字符串),则打印对象的 value,退出状态为 1。

sys.exit() 的调用被转换为异常,以便可以执行清理处理程序(finally 子句 try 语句),并且调试器可以执行脚本而不会有失去控制的风险。如果绝对必须立即退出(例如,在调用 os.fork() 之后的子进程中),则可以使用 os._exit() 函数。

code

传递给构造函数的退出状态或错误消息。(默认为 None。)

异常 TypeError

当对不适当类型的对象应用操作或函数时引发。关联的值是一个字符串,其中包含有关类型不匹配的详细信息。

用户代码可能会引发此异常,以指示对对象的尝试操作不受支持,并且也不打算支持。如果一个对象打算支持给定的操作但尚未提供实现,则应引发 NotImplementedError 异常。

传递错误类型的参数(例如,在预期 int 时传递 list)应该会导致 TypeError,但传递具有错误值的参数(例如,超出预期范围的数字)应该会导致 ValueError

异常 UnboundLocalError

在函数或方法中引用局部变量但未绑定任何值时引发。这是 NameError 的子类。

异常 UnicodeError

在发生与 Unicode 相关的编码或解码错误时引发。它是 ValueError 的子类。

UnicodeError 具有描述编码或解码错误的属性。例如,err.object[err.start:err.end] 给出了编解码器失败的特定无效输入。

encoding

引发错误的编码的名称。

reason

描述特定编解码器错误的字符串。

object

编解码器尝试编码或解码的对象。

start

object 中无效数据的第一个索引。

end

object 中最后一个无效数据之后的索引。

异常 UnicodeEncodeError

在编码过程中发生与 Unicode 相关的错误时引发。它是 UnicodeError 的子类。

异常 UnicodeDecodeError

在解码过程中发生与 Unicode 相关的错误时引发。它是 UnicodeError 的子类。

异常 UnicodeTranslateError

在转换过程中发生与 Unicode 相关的错误时引发。它是 UnicodeError 的子类。

异常 ValueError

当操作或函数接收到类型正确但值不合适的参数,并且情况没有更精确的异常(例如 IndexError)描述时引发。

异常 ZeroDivisionError

当除法或模运算的第二个参数为零时引发。关联的值是一个字符串,指示操作数的类型和操作。

以下异常是为了与以前的版本兼容而保留的;从 Python 3.3 开始,它们是 OSError 的别名。

异常 EnvironmentError
异常 IOError
异常 WindowsError

仅在 Windows 上可用。

操作系统异常

以下异常是 OSError 的子类,它们根据系统错误代码引发。

异常 BlockingIOError

当操作将在设置为非阻塞操作的对象(例如套接字)上阻塞时引发。对应于 errno EAGAINEALREADYEWOULDBLOCKEINPROGRESS

除了 OSError 的属性之外,BlockingIOError 还可以有一个额外的属性

characters_written

一个整数,包含在阻塞之前写入流的字符数。当使用 io 模块中的缓冲 I/O 类时,可以使用此属性。

异常 ChildProcessError

当子进程上的操作失败时引发。对应于 errno ECHILD

异常 ConnectionError

与连接相关问题的基类。

子类有 BrokenPipeErrorConnectionAbortedErrorConnectionRefusedErrorConnectionResetError

异常 BrokenPipeError

ConnectionError 的子类,当试图写入一个管道而另一端已关闭时引发,或试图写入一个已关闭写入的套接字时引发。对应于 errno EPIPEESHUTDOWN

异常 ConnectionAbortedError

ConnectionError 的子类,当连接尝试被对方中止时引发。对应于 errno ECONNABORTED

异常 ConnectionRefusedError

ConnectionError 的子类,当连接尝试被对方拒绝时引发。对应于 errno ECONNREFUSED

异常 ConnectionResetError

ConnectionError 的子类,当连接被对方重置时引发。对应于 errno ECONNRESET

异常 FileExistsError

当试图创建已存在的文件或目录时引发。对应于 errno EEXIST

异常 FileNotFoundError

当请求的文件或目录不存在时引发。对应于 errno ENOENT

异常 InterruptedError

当系统调用被传入信号中断时引发。对应于 errno EINTR

在 3.5 版更改: 现在,当系统调用被信号中断时,Python 会重试系统调用,除非信号处理程序引发异常(有关其理由,请参阅 PEP 475),而不是引发 InterruptedError

异常 IsADirectoryError

当在目录上请求文件操作(例如 os.remove())时引发。对应于 errno EISDIR

异常 NotADirectoryError

当在非目录上请求目录操作(例如 os.listdir())时引发。在大多数 POSIX 平台上,如果操作尝试打开或遍历非目录文件(如同它是目录一样),也可能引发此异常。对应于 errno ENOTDIR

异常 PermissionError

当试图在没有足够访问权限(例如文件系统权限)的情况下运行操作时引发。对应于 errno EACCESEPERMENOTCAPABLE

在 3.11.1 版更改: WASI 的 ENOTCAPABLE 现在映射到 PermissionError

异常 ProcessLookupError

当给定进程不存在时引发。对应于 errno ESRCH

异常 TimeoutError

当系统函数在系统级别超时时引发。对应于 errno ETIMEDOUT

3.3 版新增: 以上所有 OSError 子类均已添加。

另请参阅

PEP 3151 - 重构 OS 和 IO 异常层次结构

警告

以下异常用作警告类别;有关更多详细信息,请参阅警告类别文档。

exception Warning

警告类别的基类。

exception UserWarning

用户代码生成的警告的基类。

exception DeprecationWarning

当有关已弃用功能的警告面向其他 Python 开发人员时,将使用此基类。

默认警告过滤器会忽略此警告,但在 __main__ 模块中除外(PEP 565)。启用Python 开发模式会显示此警告。

PEP 387 中描述了弃用策略。

exception PendingDeprecationWarning

有关已过时且预计将来会被弃用的功能的警告的基类,但目前尚未弃用。

此类很少使用,因为发出有关可能即将弃用的警告是不常见的,并且对于已经处于活动状态的弃用,DeprecationWarning 更受欢迎。

默认警告过滤器会忽略此警告。启用Python 开发模式会显示此警告。

PEP 387 中描述了弃用策略。

exception SyntaxWarning

有关可疑语法的警告的基类。

exception RuntimeWarning

有关可疑运行时行为的警告的基类。

exception FutureWarning

当有关已弃用功能的警告面向使用 Python 编写的应用程序的最终用户时,将使用此基类。

exception ImportWarning

有关模块导入中可能出现的错误的警告的基类。

默认警告过滤器会忽略此警告。启用Python 开发模式会显示此警告。

exception UnicodeWarning

与 Unicode 相关的警告的基类。

exception EncodingWarning

与编码相关的警告的基类。

有关详细信息,请参阅选择加入 EncodingWarning

3.10 版新增。

exception BytesWarning

bytesbytearray 相关的警告的基类。

exception ResourceWarning

与资源使用相关的警告的基类。

默认警告过滤器会忽略此警告。启用Python 开发模式会显示此警告。

3.2 版新增。

异常组

以下是在需要引发多个不相关的异常时使用的。它们是异常层次结构的一部分,因此可以使用 except 像处理所有其他异常一样处理它们。此外,except* 可以识别它们,它根据包含的异常类型匹配它们的子组。

exception ExceptionGroup(msg, excs)
exception BaseExceptionGroup(msg, excs)

这两种异常类型都包装了序列 excs 中的异常。msg 参数必须是字符串。这两个类的区别在于 BaseExceptionGroup 扩展了 BaseException 并且可以包装任何异常,而 ExceptionGroup 扩展了 Exception 并且只能包装 Exception 的子类。这种设计是为了让 except Exception 捕获 ExceptionGroup 而不是 BaseExceptionGroup

如果所有包含的异常都是 Exception 实例,则 BaseExceptionGroup 构造函数返回 ExceptionGroup 而不是 BaseExceptionGroup,因此可以使用它来自动进行选择。另一方面,如果任何包含的异常不是 Exception 子类,则 ExceptionGroup 构造函数会引发 TypeError

message

构造函数的 msg 参数。这是一个只读属性。

exceptions

传递给构造函数的 excs 序列中的异常元组。这是一个只读属性。

subgroup(condition)

返回一个异常组,该组仅包含当前组中与 *condition* 匹配的异常,如果结果为空,则返回 None

条件可以是一个函数,该函数接受一个异常并为子组中应该包含的异常返回 true,也可以是一个异常类型或异常类型元组,用于使用与 except 子句中相同的检查来检查匹配项。

当前异常的嵌套结构将保留在结果中,其 message__traceback____cause____context____notes__ 字段的值也是如此。结果中将省略空的嵌套组。

将检查嵌套异常组中的所有异常的条件,包括顶级异常组和任何嵌套异常组。如果此类异常组的条件为 true,则将其完整包含在结果中。

split(condition)

subgroup() 类似,但返回对 (match, rest),其中 matchsubgroup(condition),而 rest 是剩余的不匹配部分。

derive(excs)

返回一个具有相同 message 的异常组,但它包装了 excs 中的异常。

此方法由 subgroup()split() 使用,它们在各种上下文中用于分解异常组。子类需要覆盖它,以便使 subgroup()split() 返回子类的实例,而不是 ExceptionGroup

subgroup()split()__traceback____cause____context____notes__ 字段从原始异常组复制到 derive() 返回的异常组,因此这些字段不需要由 derive() 更新。

>>> class MyGroup(ExceptionGroup):
...     def derive(self, excs):
...         return MyGroup(self.message, excs)
...
>>> e = MyGroup("eg", [ValueError(1), TypeError(2)])
>>> e.add_note("a note")
>>> e.__context__ = Exception("context")
>>> e.__cause__ = Exception("cause")
>>> try:
...    raise e
... except Exception as e:
...    exc = e
...
>>> match, rest = exc.split(ValueError)
>>> exc, exc.__context__, exc.__cause__, exc.__notes__
(MyGroup('eg', [ValueError(1), TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> match, match.__context__, match.__cause__, match.__notes__
(MyGroup('eg', [ValueError(1)]), Exception('context'), Exception('cause'), ['a note'])
>>> rest, rest.__context__, rest.__cause__, rest.__notes__
(MyGroup('eg', [TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])
>>> exc.__traceback__ is match.__traceback__ is rest.__traceback__
True

请注意,BaseExceptionGroup 定义了 __new__(),因此需要不同构造函数签名的子类需要覆盖它,而不是 __init__()。例如,以下定义了一个异常组子类,它接受一个 exit_code 并从中构造组的 message。

class Errors(ExceptionGroup):
   def __new__(cls, errors, exit_code):
      self = super().__new__(Errors, f"exit code: {exit_code}", errors)
      self.exit_code = exit_code
      return self

   def derive(self, excs):
      return Errors(excs, self.exit_code)

ExceptionGroup 一样,任何既是 BaseExceptionGroup 的子类又是 Exception 的子类的子类都只能包装 Exception 的实例。

3.11 版新增。

异常层次结构

内置异常的类层次结构为

BaseException
 ├── BaseExceptionGroup
 ├── GeneratorExit
 ├── KeyboardInterrupt
 ├── SystemExit
 └── Exception
      ├── ArithmeticError
      │    ├── FloatingPointError
      │    ├── OverflowError
      │    └── ZeroDivisionError
      ├── AssertionError
      ├── AttributeError
      ├── BufferError
      ├── EOFError
      ├── ExceptionGroup [BaseExceptionGroup]
      ├── 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
      ├── StopAsyncIteration
      ├── StopIteration
      ├── SyntaxError
      │    └── IndentationError
      │         └── TabError
      ├── SystemError
      ├── TypeError
      ├── ValueError
      │    └── UnicodeError
      │         ├── UnicodeDecodeError
      │         ├── UnicodeEncodeError
      │         └── UnicodeTranslateError
      └── Warning
           ├── BytesWarning
           ├── DeprecationWarning
           ├── EncodingWarning
           ├── FutureWarning
           ├── ImportWarning
           ├── PendingDeprecationWarning
           ├── ResourceWarning
           ├── RuntimeWarning
           ├── SyntaxWarning
           ├── UnicodeWarning
           └── UserWarning