我正在编写一个模块,希望对它可能引发的异常有一个统一的异常层次结构(例如,对于所有 foo
模块的特定异常,从 FooError
抽象类继承)。这允许模块的用户捕获这些特定的异常,并在需要时清楚地处理它们。但是从模块引发的许多异常都是由于其他异常引发的; 例如,在某个任务中由于文件上的 OSERerror 而失败。
我需要的是 “包装”捕获的异常,使其具有不同的类型和消息,这样信息就可以通过任何捕获异常的方式在传播层次结构的更高层次上获得。但是我不想丢失现有的类型、消息和堆栈跟踪; 这些对于尝试调试问题的人来说都是有用的信息。顶级异常处理程序是不好的,因为我试图在异常进一步向上传播堆栈之前修饰它,而顶级处理程序来得太晚了。
通过从现有类型(例如 class FooPermissionError(OSError, FooError)
)派生我的模块 foo
的特定异常类型,部分地解决了这个问题,但这并不能使用新类型包装现有的异常实例或修改消息变得更容易。
Python 的 PEP 3134“异常链和嵌入式回溯”讨论了 Python 3.0中接受的“链接”异常对象的更改,以指示在处理现有异常时引发了新的异常。
我正在尝试做的事情是相关的: 我需要它在早期的 Python 版本中也能工作,而且我不需要它来链接,只需要它来实现多态性。做这件事的正确方法是什么?