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