Exception chaining позволяет Python связывать несколько исключений вместе, сохраняя полный контекст того, что пошло не так. Это критически важно для отладки, потому что показывает полную последовательность ошибок, а не только финальную ошибку.
raise ... fromИспользуй raise NewError from original_error, чтобы явно связать новое исключение с его причиной. Python сохраняет исходное исключение в атрибуте __cause__ и выводит оба трейсбека.
try:
connect_to_database()
except ConnectionError as e:
raise RuntimeError("Service unavailable") from e
В выводе будет чётко написано: "The above exception was the direct cause of the following exception."
exceptКогда новое исключение выбрасывается внутри блока except без использования from, Python автоматически связывает их неявно. Исходное исключение сохраняется в __context__.
try:
load_config()
except FileNotFoundError:
raise RuntimeError("Failed to initialize") # implicitly chained
Python выводит: "During handling of the above exception, another exception occurred."
Если ты хочешь выбросить новое исключение без связи с исходным, используй raise NewError from None. Это очищает цепочку и скрывает исходный контекст.
__cause__ — устанавливается явной цепочкой raise ... from__context__ — устанавливается автоматически при неявной цепочке__suppress_context__ — устанавливается в True при использовании from NoneException chaining гарантирует, что никакая отладочная информация не теряется, когда исключения преобразуются или оборачиваются. Это помогает разработчикам быстро проследить ошибки до их первопричины, что особенно ценно в больших кодовых базах или при оборачивании низкоуровневых ошибок в высокоуровневые.
Атрибут __cause__ автоматически устанавливается Python всякий раз, когда в блоке except выбрасывается исключение, независимо от того, используется ли синтаксис raise ... from.
Новый — ещё не проверен сообществом
Вы