Регистрация трассировки стека исключений вместе с вызовами фактических значений аргументов метода в Python
Мне нужно знать, как я могу записать трассировку стека исключений вместе с фактическими значениями аргументов метода.
Чтобы уточнить мое требование, пожалуйста, обратитесь к следующему примеру:
Пример кода
import logging
def a(str, str2):
print str + str2
raise Exception("Custom err ==> " + str + "----" + str2)
def b(str):
a(str, "World!")
def c(str):
b(str)
try:
val = 'Hello' #Let's say this value is coming from DB
c(val)
except:
logging.exception("err", exc_info=True)
Актуальная трассировка стека в Python
HelloWorld!
ERROR:root:err
Traceback (most recent call last):
File "except.py", line 14, in <module>
c('Hello')
File "except.py", line 11, in c
b(str)
File "except.py", line 8, in b
a(str, "World!")
File "except.py", line 5, in a
raise Exception("Custom err ==> " + str + "----" + str2)
Exception: Custom err ==> Hello----World!
Обязательная трассировка стека в Python
HelloWorld!
ERROR:root:err
Traceback (most recent call last):
File "except.py", line 14, in <module>
c('Hello')
File "except.py", line 11, in c
b('Hello')
File "except.py", line 8, in b
a('Hello', "World!")
File "except.py", line 5, in a
raise Exception("Custom err ==> " + str + "----" + str2)
Exception: Custom err ==> Hello----World!
Если вы внимательно изучили трассировку Required Stack в разделе Python, я заменил оцененные значения аргументов метода в трассировке стека.
Я надеюсь, что этот пример дает четкое представление о моих требованиях
1 ответ
Вы, вероятно, не должны использовать str
как имя, но это не относится к делу.
Вы не можете иметь свое желание - модуль регистрации не печатает значения, он печатает имена, используемые в качестве параметров. Смотрите измененную программу (большинство имен переменных изменены):
import logging
def a(var_name_in_a, var_name_in_a_2):
print var_name_in_a + var_name_in_a_2
raise Exception("Custom err ==> " + var_name_in_a + "----" + var_name_in_a_2)
def b(var_name_in_b):
a(var_name_in_b, "World!")
def c(var_name):
b(var_name)
try:
val = 'Hello' #Let's say this value is coming from DB
c(val)
except:
logging.exception("stdout", exc_info=True)
и его вывод:
HelloWorld!
ERROR:root:err
Traceback (most recent call last):
File "test.py", line 11, in <module>
c(val)
File "test.py", line 8, in c
b(var_name)
File "test.py", line 6, in b
a(var_name_in_b, "World!")
File "test.py", line 4, in a
raise Exception("Custom err ==> " + var_name_in_a + "----" + var_name_in_a_2)
Exception: Custom err ==> Hello----World!
Если вы хотите получить значения, вам придется регистрировать их отдельно от исключения - и до того, как это произойдет, - впоследствии эта информация будет потеряна.