Поднимать без аргументов

документация для оператора raise без аргументов говорит

Если никаких выражений нет, рейз повторно вызывает последнее исключение, которое было активным в текущей области.

Я думал, что это означает, что текущая функция должна была выполнять предложение except. Прочитав этот вопрос и немного экспериментируя, я думаю, это означает, что любая функция в стеке должна выполнять предложение except, но я не уверен. Кроме того, я понял, что понятия не имею, как работает трассировка стека с повышением no-arg:

def f():
  try:
    raise Exception
  except:
    g()

def g():
  raise

f()

производит

Traceback (most recent call last):
  File "foo", line 10, in <module>
    f()
  File "foo", line 5, in f
    g()
  File "foo", line 3, in f
    raise Exception
Exception

Это не похоже на стек во время начального рейза, или на стек во время повторного рейза, или на конкатенацию обоих стеков или что-то, что я могу понять.

Как я могу сказать, что нет-arg-рейза, ищущего любую функцию в стеке, выполняющую предложение except? Кроме того, как работает трассировка стека на ререйзе?

Ответы

Ответ 1

Когда вы raise без аргументов, интерпретатор ищет последнее поднятое и обработанное исключение. Затем он действует так же, как если бы вы использовали raise с самым последним типом исключения, значением и трассировкой.

Это сохраняется в состоянии интерпретатора для текущего потока, и эту же информацию можно получить с помощью sys.exc_info(). "Обработано" я имею в виду, что исключение исключает исключение. Цитирование try документации документации:

Прежде чем выполнить пакет except clauses, сведения об исключении будут назначены трем переменным в модуле sys: sys.exc_type получает объект, идентифицирующий исключение; sys.exc_value получает параметр исключений; sys.exc_traceback получает объект трассировки (см. раздел Иерархия стандартного типа, определяющая точку в программе, в которой произошло исключение. Эти данные также доступны через функция sys.exc_info(), которая возвращает кортеж (exc_type, exc_value, exc_traceback).

См. примечания в цикле оценки Python (код C), в частности:

Второй   пуля была для обратной совместимости: она была (и является) общей для   имеют функцию, которая вызывается, когда исключение поймано, и   имеют эту функцию для доступа к исключенному исключению через sys.exc_ZZZ.   (Пример: traceback.print_exc()).

Отслеживание отражает то, как вы пришли к повторному поднятию точно. Это текущий стек (строка 10, вызывающая f(), строка 5, вызывающая g()), плюс исходное местоположение поднятого исключения: строка 3.