Я пишу модуль и хочу иметь единую иерархию исключений для исключений, которые он может вызывать (например, наследование от FooErrorабстрактного класса для всех fooособых исключений модуля). Это позволяет пользователям модуля перехватывать эти конкретные исключения и при необходимости обрабатывать их отдельно. Но многие исключения, вызванные модулем, возникают из-за другого исключения; например, сбой при выполнении какой-либо задачи из-за ошибки OSError в файле.
Мне нужно «обернуть» перехваченное исключение таким образом, чтобы оно имело другой тип и сообщение , чтобы информация была доступна дальше по иерархии распространения тем, что перехватывает исключение. Но я не хочу терять существующий тип, сообщение и трассировку стека; это вся полезная информация для тех, кто пытается устранить проблему. Обработчик исключений верхнего уровня бесполезен, поскольку я пытаюсь украсить исключение до того, как оно продвинется дальше по стеку распространения, а обработчик верхнего уровня опаздывает.
Это частично решается путем получения fooконкретных типов исключений моего модуля из существующего типа (например, class FooPermissionError(OSError, FooError)), но это не упрощает перенос существующего экземпляра исключения в новый тип или изменение сообщения.
В Python PEP 3134 «Цепочка исключений и встроенная трассировка» обсуждается изменение, принятое в Python 3.0 для «цепочки» объектов исключений, чтобы указать, что новое исключение было вызвано во время обработки существующего исключения.
То, что я пытаюсь сделать, связано: мне нужно, чтобы он работал и в более ранних версиях Python, и мне он нужен не для связывания, а только для полиморфизма. Как правильно это сделать?