gpt4 book ai didi

python - 使用不同的类型和消息重新引发异常,保留现有信息

转载 作者:IT老高 更新时间:2023-10-28 21:05:32 25 4
gpt4 key购买 nike

我正在编写一个模块,并希望为它可以引发的异常有一个统一的异常层次结构(例如,从所有 fooFooError 抽象类继承模块的特定异常(exception))。这允许模块的用户捕获那些特定的异常并在需要时清楚地处理它们。但是从模块中引发的许多异常都是由于其他一些异常而引发的;例如由于文件上的 OSError,某些任务失败。

我需要“包装”捕获到的异常,使其具有不同的类型和消息,以便通过捕获异常的任何方式在传播层次结构中进一步获取信息。但我不想丢失现有的类型、消息和堆栈跟踪;对于试图调试问题的人来说,这些都是有用的信息。顶级异常处理程序不好,因为我试图在异常进入传播堆栈之前对其进行修饰,而顶级处理程序为时已晚。

通过从现有类型(例如 class FooPermissionError(OSError, FooError))派生我的模块 foo 的特定异常类型,部分解决了这个问题,但这并没有t 使将现有异常实例包装在新类型中变得更容易,也不会修改消息。

Python 的 PEP 3134 “异常链接和嵌入式回溯”讨论了 Python 3.0 中接受的用于“链接”异常对象的更改,以表明在处理现有异常期间引发了新异常。

我想做的是相关的:我需要它在早期的 Python 版本中也能工作,我不需要它来进行链接,而只需要它来实现多态性。这样做的正确方法是什么?

最佳答案

Python 3 引入了异常链(如 PEP 3134 中所述)。这允许在引发异常时引用现有异常作为“原因”:

try:
frobnicate()
except KeyError as exc:
raise ValueError("Bad grape") from exc

捕获的异常(exc,a KeyError)因此成为新异常 ValueError 的一部分(是“原因”)。 “原因”可用于捕获新异常的任何代码。

通过使用此功能,设置了 __cause__ 属性。内置的异常处理程序也是 knows how to report the exception's “cause” and “context”以及回溯。


Python 2 中,这个用例似乎没有好的答案(如 Ian BickingNed Batchelder 所述)。无赖。

关于python - 使用不同的类型和消息重新引发异常,保留现有信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/696047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com