内置异常

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

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

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

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

异常上下文

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

BaseException.__context__
BaseException.__cause__
BaseException.__suppress_context__

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

通过使用带有 raisefrom,可以显式原因来补充此隐式异常上下文

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 版本之间发生变化,从而导致未来出现新的冲突。因此,建议完全避免子类化多个异常类型。

基类

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

exception 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 list” 中存在找不到的名称时也会引发。

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

name

尝试导入的模块的名称。

path

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

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

exception ModuleNotFoundError

当找不到模块时,import 引发的 ImportError 的子类。当在 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 的子类,如下面的 OS 异常中所述。特定的子类取决于最终的 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* 构造函数参数和属性。

exception OverflowError

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

exception PythonFinalizationError

此异常派生自 RuntimeError。当在解释器关闭期间(也称为Python 最终化)操作被阻塞时,会引发此异常。

以下是一些在 Python 最终化期间可能被 PythonFinalizationError 阻塞的操作示例:

另请参阅 sys.is_finalizing() 函数。

3.13 版本新增: 此前,会引发一个普通的 RuntimeError

exception RecursionError

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

3.5 版本新增: 此前,会引发一个普通的 RuntimeError

exception ReferenceError

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

exception RuntimeError

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

exception 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

exception StopAsyncIteration

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

3.5 版本新增。

exception SyntaxError(message, details)

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

异常实例的 str() 仅返回错误消息。详细信息是一个元组,其成员也可以作为单独的属性访问。

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 属性。

exception IndentationError

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

exception TabError

当缩进包含制表符和空格的不一致使用时,会引发此异常。它是 IndentationError 的子类。

exception SystemError

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

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

exception SystemExit

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

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

code

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

exception TypeError

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

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

传递错误类型的参数(例如,当期望一个 int 时传递一个 list)应该导致 TypeError,但是传递错误值的参数(例如,超出预期范围的数字)应该导致 ValueError

exception UnboundLocalError

当在函数或方法中引用局部变量,但该变量没有绑定值时引发。这是 NameError 的子类。

exception UnicodeError

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

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

encoding

引发错误的编码名称。

reason

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

object

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

start

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

end

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

exception UnicodeEncodeError

当编码期间发生与 Unicode 相关的错误时引发。它是 UnicodeError 的子类。

exception UnicodeDecodeError

当解码期间发生与 Unicode 相关的错误时引发。它是 UnicodeError 的子类。

exception UnicodeTranslateError

当转换期间发生与 Unicode 相关的错误时引发。它是 UnicodeError 的子类。

exception ValueError

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

exception ZeroDivisionError

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

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

exception EnvironmentError
exception IOError
exception WindowsError

仅在 Windows 上可用。

OS 异常

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

exception BlockingIOError

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

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

characters_written

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

exception ChildProcessError

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

exception ConnectionError

与连接相关问题的基类。

子类包括 BrokenPipeError, ConnectionAbortedError, ConnectionRefusedErrorConnectionResetError

exception BrokenPipeError

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

exception ConnectionAbortedError

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

exception ConnectionRefusedError

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

exception ConnectionResetError

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

exception FileExistsError

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

exception FileNotFoundError

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

exception InterruptedError

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

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

exception IsADirectoryError

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

exception NotADirectoryError

当对不是目录的内容请求目录操作(例如 os.listdir())时引发。 在大多数 POSIX 平台上,如果操作尝试将非目录文件作为目录打开或遍历,也可能会引发此错误。 对应于 errno ENOTDIR

exception PermissionError

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

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

exception ProcessLookupError

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

exception 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

条件可以是异常类型或异常类型元组,在这种情况下,将使用 except 子句中使用的相同检查来检查每个异常是否匹配。条件也可以是可调用对象(类型对象除外),它接受一个异常作为其单个参数,并为应该在子组中的异常返回 true。

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

将检查嵌套异常组(包括顶层和任何嵌套异常组)中的所有异常的条件。如果条件对于这样的异常组为 true,则将其完整地包含在结果中。

在 3.13 版本中新增: condition 可以是任何不是类型对象的可调用对象。

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 并从中构造组消息的异常组子类。

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 类似,任何也是 Exception 子类的 BaseExceptionGroup 子类,只能包装 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
      │    ├── PythonFinalizationError
      │    └── 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