Я пишу модуль и хочу иметь единую иерархию исключений для исключений, которые она может поднять (например, наследование от абстрактного класса для всех foo
исключительные исключения модуля). Это позволяет пользователям модуля улавливать те особые исключения и обрабатывать их отчетливо, если это необходимо. Но многие из исключений, поднятых из модуля, возникают из-за какого-то другого исключения; например при выполнении какой-либо задачи из-за OSError в файле.Исключить повторное возбуждение с другим типом и сообщением, сохраняя существующую информацию
«обернуть» исключение, пойманное таким образом, чтобы оно имело другой тип и сообщение, чтобы информация была доступна в дальнейшем по иерархии распространения независимо от того, что улавливает исключение. Но я не хочу потерять существующий тип, сообщение и трассировку стека; это вся полезная информация для тех, кто пытается отладить проблему. Обработчик исключений верхнего уровня не подходит, поскольку я пытаюсь украсить исключение, прежде чем он продвигается дальше по стеку распространения, а обработчик верхнего уровня слишком поздно.
Это частично решается путем получения конкретных типов исключений моего модуля foo
из существующего типа (например, class FooPermissionError(OSError, FooError)
), но это не облегчает перенос существующего экземпляра исключения в новый тип или изменение сообщение.
Python's PEP 3134 «Цепочки исключений и встроенные трассировки» обсуждает изменение, принятое в Python 3.0 для «цепочки» объектов исключения, чтобы указать, что во время обработки существующего исключения было создано новое исключение.
То, что я пытаюсь сделать, связано: мне нужно, чтобы он также работал в более ранних версиях Python, и мне это нужно не для цепочки, а только для полиморфизма. Каков правильный способ сделать это?
Исключения уже полностью полиморфный - все они являются подклассами Исключения. Что ты пытаешься сделать? «Различное сообщение» довольно тривиально с обработчиком исключений верхнего уровня. Почему вы меняете класс? –
Как объясняется в вопросе (теперь, спасибо за ваш комментарий): Я пытаюсь украсить исключение, которое я поймал, чтобы он мог распространяться дальше с большей информацией, но не теряя. Слишком поздно обработчик верхнего уровня. – bignose
Пожалуйста, взгляните на мой класс [CausedException] (http://code.activestate.com/recipes/578252-python-exception-chains-or-trees/?in=user-4182236), который может делать то, что вы хотите Python 2.x. Также в Python 3 это может быть полезно, если вы хотите предоставить более одного исходного исключения в качестве причины вашего исключения. Возможно, это соответствует вашим потребностям. – Alfe