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

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