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