Получить описание исключения и трассировку стека, вызвавшую исключение, все в виде строки

" Дизайн и Эволюция C++ " Bjarne Stroustrup

Помимо предоставления большого количества фона на C++, это - также долгое исследование компромиссов и проблем дизайна, вовлеченных в крупномасштабную программу.

BN.com

375
задан ianace 15 January 2019 в 21:53
поделиться

2 ответа

Для [1 110] Python 3.5 + :

Так, можно получить stacktrace от исключения как от любого другого исключения. Используйте traceback.TracebackException для него (просто замена ex за Вашим исключением):

print("".join(traceback.TracebackException.from_exception(ex).format())

расширенный пример и другие функции, чтобы сделать это:

import traceback

try:
    1/0
except Exception as ex:
    print("".join(traceback.TracebackException.from_exception(ex).format()) == traceback.format_exc() == "".join(traceback.format_exception(type(ex), ex, ex.__traceback__))) # This is True !!
    print("".join(traceback.TracebackException.from_exception(ex).format()))

вывод будет чем-то вроде этого:

True
Traceback (most recent call last):
  File "untidsfsdfsdftled.py", line 29, in <module>
    1/0
ZeroDivisionError: division by zero
1
ответ дан 22 November 2019 в 23:59
поделиться

Если Ваша цель состоит в том, чтобы заставить исключение и stacktrace передать взгляд точно как то, когда Python бросает ошибку, следующие работы в обоих Python 2+3:

import sys, traceback


def format_stacktrace():
    parts = ["Traceback (most recent call last):\n"]
    parts.extend(traceback.format_stack(limit=25)[:-2])
    parts.extend(traceback.format_exception(*sys.exc_info())[1:])
    return "".join(parts)

# EXAMPLE BELOW...

def a():
    b()


def b():
    c()


def c():
    d()


def d():
    assert False, "Noooh don't do it."


print("THIS IS THE FORMATTED STRING")
print("============================\n")

try:
    a()
except:
    stacktrace = format_stacktrace()
    print(stacktrace)

print("THIS IS HOW PYTHON DOES IT")
print("==========================\n")
a()

Это работает путем удаления последнего format_stacktrace() вызов от стека и присоединения к остальным. Когда выполнено, пример выше дает следующий вывод:

THIS IS THE FORMATTED STRING
============================

Traceback (most recent call last):
  File "test.py", line 31, in <module>
    a()
  File "test.py", line 12, in a
    b()
  File "test.py", line 16, in b
    c()
  File "test.py", line 20, in c
    d()
  File "test.py", line 24, in d
    assert False, "Noooh don't do it."
AssertionError: Noooh don't do it.

THIS IS HOW PYTHON DOES IT
==========================

Traceback (most recent call last):
  File "test.py", line 38, in <module>
    a()
  File "test.py", line 12, in a
    b()
  File "test.py", line 16, in b
    c()
  File "test.py", line 20, in c
    d()
  File "test.py", line 24, in d
    assert False, "Noooh don't do it."
AssertionError: Noooh don't do it.
0
ответ дан 22 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: