Повторно вызвать исключение с другим типом и сообщением, сохранив существующую информацию.Python

Программы на Python
Anonymous
Повторно вызвать исключение с другим типом и сообщением, сохранив существующую информацию.

Сообщение Anonymous »

Я пишу модуль и хочу иметь единую иерархию исключений для исключений, которые он может создавать (например, наследование от абстрактного класса FooError для всех конкретных исключений модуля foo). Это позволяет пользователям модуля перехватывать эти конкретные исключения и при необходимости обрабатывать их отдельно. Но многие исключения, вызванные модулем, возникают из-за какого-либо другого исключения; например сбой при выполнении некоторой задачи из-за ошибки OSError в файле.

Что мне нужно, так это «обернуть» пойманное исключение так, чтобы оно имело другой тип и сообщение, чтобы информация была доступна дальше по иерархии распространения тем, кто перехватывает исключение. Но я не хочу потерять существующий тип, сообщение и трассировку стека; это вся полезная информация для тех, кто пытается отладить проблему. Обработчик исключений верхнего уровня бесполезен, так как я пытаюсь декорировать исключение до того, как оно дойдет дальше по стеку распространения, а обработчик верхнего уровня опаздывает.

Это частично решается путем получения конкретных типов исключений моего модуля foo из существующего типа (например, класса FooPermissionError(OSError, FooError)), но это не облегчает обертывание существующего экземпляр исключения в новом типе и не изменять сообщение.

Python PEP 3134 «Связывание исключений и встроенные обратные трассировки» обсуждает изменение, принятое в Python 3.0 для «связывания» объектов исключений, чтобы указать, что новое исключение было вызвано во время обработки существующего исключения.

То, что я пытаюсь сделать, связано с этим: мне нужно, чтобы это также работало в более ранних версиях Python, и мне нужно это не для цепочки, а только для полиморфизма. Как правильно это сделать?

Вернуться в «Python»