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. The исходный запрос ошибка для этого был подан сам кстати.


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

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