我正在编写一个模块,希望为它可能引发的异常(例如从FooError
抽象类继承所有Foo
模块的特定异常)建立统一异常层次结构。这使得模块的用户可以捕获这些特定的异常并进行不同的处理(如果需要)。但是,该模块引发的许多异常是由于其他异常引起的;例如,在文件上有OSError
时,执行某些任务失败。
我需要的是“包装”被捕获的异常,以便它具有不同的类型和消息,以便任何捕获异常的人都能够在更高的传播层次结构中获得信息。但我不想失去现有的类型、消息和堆栈跟踪;对于尝试调试问题的人来说,这都是有用的信息。顶级异常处理程序无法胜任此工作,因为我正在尝试在异常到达更高的传播堆栈之前修饰异常,而顶级处理程序太晚了。
通过从现有类型(例如class FooPermissionError(OSError, FooError)
)派生出模块Foo
的特定异常类型,部分解决了此问题,但这并不使在新类型中包装现有异常实例更加容易,也不能修改消息。
Python的PEP 3134“异常链接和嵌入式跟踪”讨论了Python 3.0中接受的一项变更,用于“链接”异常对象,以指示在处理现有异常期间引发了新异常。
我正在尝试做的与此相关:我需要让它在早期版本的Python中工作,并且我只需要它用于多态性,而不是用于链接。应该如何正确地实现这个功能?