Исключения в Python: raise ... from и атрибут __cause__
@python_quizРазберем этот квиз
Коротко: в примере используется явная цепочка исключений через raise ... from. Это сохраняет исходное исключение в атрибуте __cause__ у нового исключения.
Исходный код

Этот фрагмент печатает тип пойманного исключения и тип его __cause__.
Что делает raise ... from
raise NewError(...) from original_excсоздаёт новое исключениеNewErrorи явно связывает его сoriginal_exc.- Связь хранится в
NewError.__cause__. - Если
fromне указан, интерпретатор автоматически сохраняет предыдущее исключение в__context__(если исключение произошло во время обработки другого), а__cause__остаётсяNone. - Можно подавить автоматический контекст с помощью
from None— тогда__context__не будет отображаться в трассировке.
Вывод программы
Программа выведет:

Пояснение: в except переменная e — объект ConfigError, а e.__cause__ — объект FileNotFoundError.
Анализ вариантов (почему одни совпадают, а другие — нет)
- "
ConfigError->FileNotFoundError" — соответствует выводу. Первое слово — имя класса внешнего исключения, второе — имя класса причины. - "
ConfigError-> None" — имело бы место, если быfromне использовался. Тогда__cause__был быNone, а исходное исключение попало бы в__context__. - "
FileNotFoundError->ConfigError" — обратный порядок: здесь предполагается, что поймано бы первоначальное исключение, а причина — новое. В данном коде это не так: новое исключение — внешний уровень. - "Exception ->
FileNotFoundError" — неверно, потому что типe— конкретный классConfigError, а не общийException. Вывод функцииtype(e).__name__даст именноConfigError.
Наглядные эксперименты
1) Поведение без from (исходное исключение в __context__):

Вывод покажет, что __cause__ — None, а __context__ — FileNotFoundError.
2) Подавление контекста (from None):

Здесь контекст не отображается и __cause__ остаётся None.
Вывод
Использование raise ... from явно связывает исключения через __cause__. В рассматриваемом фрагменте это даёт вывод "ConfigError -> FileNotFoundError" — внешний класс исключения и класс его причины. Это удобный механизм для создания более понятных и контролируемых трассировок ошибок в коде.