" Дизайн и Эволюция C++ " Bjarne Stroustrup
Помимо предоставления большого количества фона на C++, это - также долгое исследование компромиссов и проблем дизайна, вовлеченных в крупномасштабную программу.
Для [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
Если Ваша цель состоит в том, чтобы заставить исключение и 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.