Как повторно вызвать то же исключение без трассировки? - PullRequest
0 голосов
/ 28 мая 2018

В блоке except я хочу вызвать то же исключение, но без трассировки стека и без информации о том, что это исключение было вызвано как прямая причина другого исключения.(и без изменения sys.tracebacklimit глобально)

Кроме того, у меня есть очень неуклюжий класс исключений, который анализирует и изменяет текст сообщения, поэтому я не могу просто воспроизвести его.

Мой текущий подход

try:
    deeply_nested_function_that_raises_exception()
except ClumsyExceptionBaseClass as exc:
    cls, code, msg = exc.__class__, exc.code, exc.msg
raise cls("Error: %d %s" % (code, msg))

Здесь я делаю декомпозицию информацию об исключении, повторную сборку новое исключение с сообщением, которое будет проанализировано и разбито накод ошибки и сообщение в конструкторе и вызовите его за пределами блока except , чтобы забыть всю информацию трассировки.

Есть ли более питонский способ сделать это?Все, что я хочу, это избавиться от шумной (и бесполезной в моем случае) трассировки, сохраняя информацию, содержащуюся в объекте исключения.

1 Ответ

0 голосов
/ 09 июня 2018

В Python 3 вы можете использовать with_traceback для удаления накопленных записей трассировки:

try: ...
except Exception as e:
  raise e.with_traceback(None)

В Python 2 это просто

try: ...
except Exception as e:
  raise e   # not just "raise"

Это, конечно, будетпо-прежнему отображать трассу до этой строки, поскольку она добавляется по мере распространения исключения (снова).

...