Ответ 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.