跳转到主要内容

PEP 654 (异常组)的回滚

项目描述

Build Status Code Coverage

这是从Python 3.11中回滚BaseExceptionGroupExceptionGroup类的备份。

它包含以下内容

  • exceptiongroup.BaseExceptionGroupexceptiongroup.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()处理BaseExceptionGroupExceptionGroup

抑制异常

此库包含Python 3.12.1中contextlib.suppress()上下文管理器的回溯。它允许您在选择性地忽略某些异常,即使它们在异常组内部

from exceptiongroup import suppress

with suppress(RuntimeError):
    raise ExceptionGroup("", [RuntimeError("boo")])

关于猴子补丁的说明

为了在打印未处理的异常组时使异常组正确渲染,当在小于3.11的任何Python版本中导入时,此包执行以下两项操作:

  1. traceback.TracebackException类被猴子补丁以存储有关异常组的额外信息(在__init__()中)并正确格式化它们(在format()中)

  2. 安装了异常钩子sys.excepthook,前提是没有其他钩子已经存在。此钩子会导致异常使用traceback.TracebackException而不是内置的渲染进行格式化。

如果导入exceptiongroup时发现sys.exceptionhook被设置为默认值以外的值,则不会进行任何猴子补丁。

要防止安装异常钩子和补丁,请设置环境变量EXCEPTIONGROUP_NO_PATCH1

格式化异常组

通常,此库在导入时应用的猴子补丁会导致异常组在回溯中正确打印。但如果猴子补丁被第三方异常钩子阻止,或者显式禁用猴子补丁,您仍然可以使用本页顶部列出的特殊版本的traceback函数(如format_exception())手动格式化异常。它们的工作方式与traceback模块中的对应函数一样,只是它们使用单独修补的TracebackException子类进行渲染。

特别是当库安装其自己的异常钩子时,建议使用这些特殊版本来执行异常/回溯的实际格式化。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

exceptiongroup-1.2.2.tar.gz (28.9 kB 查看散列值)

上传时间 源代码

构建分发

exceptiongroup-1.2.2-py3-none-any.whl (16.5 kB 查看散列值)

上传时间 Python 3

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面