在Python中捕获异常提升框架

时间:2015-04-20 18:59:45

标签: python debugging exception logging error-logging

我想要更详细的错误日志。

具体来说,我想从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

您如何访问必要的框架来执行此操作?

3 个答案:

答案 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捕获堆叠本地人。