我想要更详细的错误日志。
具体来说,我想从except子句中访问异常提升框架的f_locals
。
def dumb_raiser(string: str):
if not isinstance(string, str):
raise ValueError("Yup")
try:
dumb_raiser(1)
except ValueError as ex:
# grab f_locals from frame and log here
pass
您如何访问必要的框架来执行此操作?
答案 0 :(得分:0)
一种方法是在提升它时简单地将函数的locals()
添加到异常中:
def dumb_raiser(string: str):
if not isinstance(string, str):
raise ValueError("Yup", locals())
try:
dumb_raiser(1)
except ValueError as ex:
print(ex.args[1])
这会打印:{'string': 1}
,正如您所期望的那样。
答案 1 :(得分:0)
我不知道这是不是最好的方式(你也可以在这里检查一下堆栈框架),但想法是只使用装饰器。
def derp(f):
def wrapped(*args, **kwargs):
try:
f(*args, **kwargs)
except Exception as ex:
raise ValueError("Failed args %s" % args)
return wrapped
def dumb_raiser(string):
if not isinstance(string, str):
raise ValueError("Yup")
try:
dumb_raiser = derp(dumb_raiser)
dumb_raiser(1)
except ValueError as ex:
print ex.message
显然,您可以在装饰异常处理中执行任何操作。我只是用一个简单的字符串重新引发了一个ValueError,以显示传递的参数。
答案 2 :(得分:0)
您可以从Sentry的Python client中取出,该{{3}}使用f_locals
捕获堆叠本地人。