Python только печать трассировки возбуждаемого исключения - PullRequest
3 голосов
/ 27 апреля 2020

Я поднимаю новое исключение в блоке try-Кроме с дополнительным сообщением. Исходная трассировка исключений, следовательно, больше не нужна. Есть ли способ удалить исходную трассировку и распечатать только трассировку только что созданного исключения?

Пример кода (Python 3.6.10):

try:
    10/0
except:
    raise Exception('some error')

Вывод:

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
d:\xxx\main.py in 
      1 try:
----> 2     10/0
      3 except:

ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Exception                                 Traceback (most recent call last)
d:\xxx\main.py in 
      2     10/0
      3 except:
----> 4     raise Exception('some error')

Exception: some error

Желаемый выход:

---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
d:\xxx\main.py in 
      2     10/0
      3 except:
----> 4     raise Exception('some error')

Exception: some error

Ответы [ 2 ]

4 голосов
/ 27 апреля 2020

Я поднимаю новое исключение в блоке try-exc с дополнительным сообщением. Исходная трассировка исключений, следовательно, больше не нужна.

Вы можете отказаться от первоначального исключения, но я бы пересмотрел это решение. Причина и контекст исключений были добавлены в Python 3, потому что информация об исходном исключении и трассировке стека является полезной. Я бы явно пометил исходное исключение как причину нового исключения, которое немного изменяет сообщение:

try:
    1/0
except ZeroDivisionError as e:
    raise Exception("Oh crud") from e

Вывод:

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    1/0
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "main.py", line 4, in <module>
    raise Exception("Oh crud") from e
Exception: Oh crud

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

try:
    1/0
except ZeroDivisionError:
    raise Exception("Oh crud") from None

Вывод:

Traceback (most recent call last):
  File "main.py", line 4, in <module>
    raise Exception("Oh crud") from None
Exception: Oh crud
0 голосов
/ 27 апреля 2020

Используйте with_traceback

import sys, traceback
try:
    10/0
except Exception as exc:
    raise  exc.with_traceback(None)
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-31-d77f0aded0d7> in <module>()
      3     10/0
      4 except Exception as exc:
----> 5     raise  exc.with_traceback(None)

ZeroDivisionError: division by zero

Если вы просто хотите показать это:

import sys, traceback
try:
    10/0
except Exception:
    ex_type, ex, tb = sys.exc_info()
    traceback.print_tb(tb)
File "<ipython-input-4-1283199eb169>", line 3, in <module>
    10/0

ALTERNATIVE

import sys, traceback
try:
    10/0
except Exception as exc:
    tb_str = traceback.format_exception(etype=type(exc), value=exc, tb=exc.__traceback__)
    for i in tb_str: print(i)
Traceback (most recent call last):

  File "<ipython-input-17-3bc95dc2ebf5>", line 3, in <module>
    10/0

ZeroDivisionError: division by zero
...