======Raise======
Возбуждает указанное исключение.
Инструкция позволяет прервать штатный поток исполнения при помощи возбуждения исключения.
Если после инструкции отсутствует выражение (например, не указывается тип исключения), то повторно поднимается отловленное исключение. Если в данной области нет активного исключения (например, raise не находится внутри блока except), возбуждается TypeError
try:
# Допустим в функции поднимается FileNotFoundError.
do()
except OSError:
# Инструкция raise без выражения поднимет FileNotFoundError повторно.
raise
Если выражение присутствует, то результатом его вычисления должен являться либо экземпляр наследника **BaseException**, либо сам наследник, то есть тип. Во втором случае объект исключения будет сформирован путём инстанциирования типа без аргументов.
# Объект сформируется из класса автоматически.
raise MyException
# Формируем объект исключения вручную.
raise MyException('Моё исключение')
====Объект трассировки----
Объект трассировки обычно создаётся автоматически при возбуждении исключения и подвязывается к нему в атрибут **__traceback__** (поддерживает запись). Вы можете в один приём создать исключение и подвязать к нему трассировку при помощи метода исключения **with_traceback()** — метод вернёт тот же объект исключения для которого вызван:
raise Exception('Возбуждено исключение').with_traceback(traceback_obj)
====Цепочки исключений====
Для формирования цепочек исключений используется дополнение from, после которого требуется указать ещё одно исключение (класс, либо объект). Это исключение будет подвязано к возбуждаемому в атрибут **__cause__** (поддерживает запись). В результате, если возбуждаемое исключение не обработано, но на вывод будут отправлены оба исключения:
try:
print(1 / 0)
except Exception as exc:
# Наше второе исключение никто не поймает
# поэтому будет выведена цепочка
# из двух исключений.
raise RuntimeError('Явная цепочка исключений') from exc
Похожий механизм срабатывает автоматически, если исключение возбуждается внутри обработчика, либо блока **finally** — предыдущее исключение подвязывается в атрибут **__context__** нового:
try:
print(1 / 0)
except:
raise RuntimeError('Неявная цепочка исключений')
Автоматическое формирование цепочки можно подавить, указав **None** после **from**. В ходе данной операции задействуется атрибут **__suppress_context__**.