PEP 654 (异常组)的回滚
项目描述
这是从Python 3.11中回滚BaseExceptionGroup和ExceptionGroup类的备份。
它包含以下内容
exceptiongroup.BaseExceptionGroup和exceptiongroup.ExceptionGroup类
一个用于捕获可能嵌套在异常组中的异常的实用函数(exceptiongroup.catch())
对TracebackException类的修补,以正确格式化异常组(在导入时安装)
一个异常钩子,通过TracebackException处理异常组的格式化(在导入时安装)
一些来自traceback模块的函数的特殊版本,修改后可以正确处理异常组,即使禁用了猴子补丁或被另一个自定义异常钩子阻止
traceback.format_exception()
traceback.format_exception_only()
traceback.print_exception()
traceback.print_exc()
从Python 3.12.1回滚的contextlib.suppress()版本,它还处理异常组内的异常抑制
如果在此Python 3.11或更高版本上导入此包,则使用内置的异常组类实现,TracebackException不会被猴子补丁,异常钩子也不会被安装。
有关异常组的更多信息,请参阅标准库文档。
捕获异常
由于早期Python版本中缺乏由PEP 654引入的except*语法,您需要使用exceptiongroup.catch()来捕获可能嵌套在异常组中的异常。此函数返回一个上下文管理器,它为与唯一参数匹配的任何异常调用给定的处理程序。
catch()的参数必须是一个字典(或任何Mapping),其中每个键要么是异常类,要么是异常类的可迭代对象。每个值必须是一个接受单个位置参数的可调用对象。处理程序最多被调用一次,以异常组作为参数,该异常组将包含所有给定类型的异常或其子类。异常组可能包含包含更多匹配异常的嵌套组。
因此,以下Python 3.11+代码
try:
...
except* (ValueError, KeyError) as excgroup:
for exc in excgroup.exceptions:
print('Caught exception:', type(exc))
except* RuntimeError:
print('Caught runtime error')
可以这样使用此回溯
from exceptiongroup import BaseExceptionGroup, catch
def value_key_err_handler(excgroup: BaseExceptionGroup) -> None:
for exc in excgroup.exceptions:
print('Caught exception:', type(exc))
def runtime_err_handler(exc: BaseExceptionGroup) -> None:
print('Caught runtime error')
with catch({
(ValueError, KeyError): value_key_err_handler,
RuntimeError: runtime_err_handler
}):
...
注意:与except*一样,您不能使用catch()处理BaseExceptionGroup或ExceptionGroup。
抑制异常
此库包含Python 3.12.1中contextlib.suppress()上下文管理器的回溯。它允许您在选择性地忽略某些异常,即使它们在异常组内部
from exceptiongroup import suppress
with suppress(RuntimeError):
raise ExceptionGroup("", [RuntimeError("boo")])
关于猴子补丁的说明
为了在打印未处理的异常组时使异常组正确渲染,当在小于3.11的任何Python版本中导入时,此包执行以下两项操作:
traceback.TracebackException类被猴子补丁以存储有关异常组的额外信息(在__init__()中)并正确格式化它们(在format()中)
安装了异常钩子sys.excepthook,前提是没有其他钩子已经存在。此钩子会导致异常使用traceback.TracebackException而不是内置的渲染进行格式化。
如果导入exceptiongroup时发现sys.exceptionhook被设置为默认值以外的值,则不会进行任何猴子补丁。
要防止安装异常钩子和补丁,请设置环境变量EXCEPTIONGROUP_NO_PATCH为1。
格式化异常组
通常,此库在导入时应用的猴子补丁会导致异常组在回溯中正确打印。但如果猴子补丁被第三方异常钩子阻止,或者显式禁用猴子补丁,您仍然可以使用本页顶部列出的特殊版本的traceback函数(如format_exception())手动格式化异常。它们的工作方式与traceback模块中的对应函数一样,只是它们使用单独修补的TracebackException子类进行渲染。
特别是当库安装其自己的异常钩子时,建议使用这些特殊版本来执行异常/回溯的实际格式化。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
exceptiongroup-1.2.2.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc |
|
MD5 | e371f497eba3ca3fa6ac6f0dc2a08919 |
|
BLAKE2b-256 | 09352495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92 |
exceptiongroup-1.2.2-py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b |
|
MD5 | 59d2b950145f615193c5ccb02795fdef |
|
BLAKE2b-256 | 02ccb7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf |