Я пишу модуль і хочу мати єдину ієрархію винятків за винятками, які він може викликати (наприклад, успадкування від FooError
абстрактного класу за всіма foo
винятками модуля). Це дозволяє користувачам модуля вловлювати ці конкретні винятки та чітко обробляти їх, якщо потрібно. Але багато винятків, викладених із модуля, виникають через якийсь інший виняток; наприклад, невдача в якомусь завданні через OSError у файлі.
Мені потрібно «обернути» виняток, що потрапляє таким чином, що він має інший тип і повідомлення , щоб інформація була доступна в подальшому для ієрархії поширення, що б не сприймало виняток. Але я не хочу втрачати існуючий тип, повідомлення та стек; це вся корисна інформація для того, хто намагається налагодити проблему. Обробник винятків верхнього рівня не є корисним, оскільки я намагаюся прикрасити виняток, перш ніж він пробиватиметься вперед до стека розповсюдження, і обробник верхнього рівня запізнився.
Частково це вирішується шляхом отримання foo
специфічних типів виключень мого модуля з існуючого типу (наприклад class FooPermissionError(OSError, FooError)
), але це не полегшує перенесення існуючого екземпляра винятків у новий тип, а також не змінення повідомлення.
PEP 3134 Python "Виключення ланцюга та вбудовані відстеження" обговорює зміну, прийняту в Python 3.0 для "ланцюжків" об'єктів винятків, щоб вказати, що під час обробки існуючого винятку було піднято нове виключення.
Те, що я намагаюся зробити, пов'язане: мені це потрібно і в більш ранніх версіях Python, і мені це потрібно не для прикування, а лише для поліморфізму. Який правильний спосіб це зробити?
except Exception as e
-> raise type(e), type(e)(e.message + custom_message), sys.exc_info()[2]
-> це рішення з іншого питання SO . Це не дуже, але функціонально.