Выражение raise

raise_stmt ::= «raise» [expression [«from» expression]]

В случае отсутствия expression, повторно возбуждается последнее исключение, которое было активно в данной области. Если такого исключения нет, то возбуждается исключение RuntimeError, чтобы сообщить о данной ошибке.

В противном случае raise выполняет первый expression и получает объект исключения. Он должен являться либо подклассом либо экземпляром BaseException. Если первый expression является именем класса, то создается объект путём вызова класса без передачи аргументов.

Типом данного исключения является класс экземпляра исключения, а значением — сам экземпляр.

Объект трассировки обычно создается автоматически при возбуждении исключения и присоединяется к атрибуту исключения __traceback__, доступному для записи. Вы можете создать исключение и сами установить свою собственную трассировку используя  метод исключения with_traceback() (который возвращает тот же самый экземпляр исключения с установленным аргументом трассировки), как например:

raise Exception("foo occurred").with_traceback(tracebackobj)

Оператор from используется для создания цепочки исключений: если он присутствует, то второй expression должен быть другим классом или экземпляром исключения, которое будет присоединено к возбуждаемому исключению в качестве атрибута  __cause__ (доступного для записи). Если возбуждаемое исключение не перехватывается, то оба исключения будут напечатаны:

>>> try:
...     print(1 / 0)
... except Exception as exc:
...     raise RuntimeError("Something bad happened") from exc...

Traceback (most recent call last):
File «», line 2, in
ZeroDivisionError: int division or modulo by zero

The above exception was the direct cause of the following exception:
/*Исключение выше было прямой причиной следующего исключения*/

Traceback (most recent call last):
  File "", line 4, in 
RuntimeError: Something bad happened

Похожий механизм работает если исключение возникло в процессе перехвата исключения: первое исключение будет присоединено к атрибуту __context__ нового исключения:

>>> try:
...     print(1 / 0)
... except:
...     raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
  File "", line 2, in 
ZeroDivisionError: int division or modulo by zero

During handling of the above exception, another exception occurred:

/*В процессе перехвата вышеуказанного исключения возникло новое исключение:*/

Traceback (most recent call last):
File «», line 4, in
RuntimeError: Something bad happened

Дополнительную информацию про исключения можно найти в разделе Исключения, а про перехват исключений в разделе выражение try.

Автор: Ishayahu Lastov