我在python中创建了一个日志记录模块,它将运行时发生的每个异常报告给服务器,因此在我必须编写的每个函数中都有:
def a_func():
try:
#stuff here
pass
except:
Logger.writeError(self.__class__.__name__, inspect.stack()[1][3],\
tracer(self, vars()))
正如您所看到的,我使用vars()函数来获取导致异常的变量。我读到了装饰器,我决定使用它们:
def flog(func):
def flog_wrapper(*args, **kwargs):
try:
func(*args, **kwargs)
except Exception as e:
print "At flog:", e
#self.myLogger.writeError(self.__class__.__name__, inspect.stack()[1][3], tracer(self, vars()))
return flog_wrapper
问题是我无法访问原始函数的(func)变量(vars())。有没有办法在装饰器功能中访问它们?
答案 0 :(得分:0)
您不需要使用vars()
。异常的追溯具有您需要的一切:
import sys
def flog(func):
def flog_wrapper(self, *args, **kwargs):
try:
return func(self, *args, **kwargs)
except Exception:
exc_type, exc_value, tb = sys.exc_info()
print "At flog:", exc_value
locals = tb.tb_frame.f_locals
self.myLogger.writeError(type(self).__name__, inspect.stack()[1][3], tracer(self, locals))
del tb
return flog_wrapper
回溯包含一系列链接的执行帧;每个框架都有对该框架中使用的本地人的引用。
你非常希望清理对追溯的引用;因为回溯包含包装函数框架,所以你有一个循环引用,最好早点打破。