Инструменты пользователя

Инструменты сайта


python:exception:raise

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.
python/exception/raise.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)