Python печатает только последнюю трассировку?

Рассмотрим следующий код и трассировку:

>>> try:
...  raise KeyboardInterrupt
... except KeyboardInterrupt:
...  raise Exception
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
Exception
>>> 

Я хочу напечатать только самую последнюю трассировку (тот, в котором было поднято Exception).
Как этого добиться?


Из приведенного выше примера я хотел бы напечатать следующее, как если бы raise Exception был вызван вне предложения except.

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
Exception

person kiri    schedule 19.12.2013    source источник
comment
Под get вы имеете в виду получение объекта исключения или не печатаете контекстную информацию? Если вы имеете в виду второе, вам нужна какая-то глобальная настройка интерпретатора или что-то, что применяется к конкретным исключениям?   -  person user2357112 supports Monica    schedule 19.12.2013


Ответы (1)


Идеальный вопрос для меня.

Вы можете подавить контекст исключения, то есть первую часть трассировки, явно вызвав исключение from None:

>>> try:
        raise KeyboardInterrupt
    except:
        raise Exception from None

Traceback (most recent call last):
  File "<pyshell#4>", line 4, in <module>
    raise Exception from None
Exception

Это было формализовано в PEP 409 и улучшено в PEP 415. Между прочим, исходный запрос об ошибке для этого был подан мной.


Обратите внимание, что подавление контекста фактически не удаляет контекст из нового исключения. Таким образом, вы все еще можете получить доступ к исходному исключению:

try:
    try:
        raise Exception('inner')
    except:
        raise Exception('outer') from None
except Exception as e:
    print(e.__context__) # inner
person poke    schedule 19.12.2013