这可能是有史以来最愚蠢的问题,但我想知道是否有办法在函数(最好是装饰器)周围编写一个包装器,这样你就可以在异常情况下捕获局部变量的内部状态.在这个职能中提出 它会捕获当地人创建它们,腌制它们,然后在没有引发异常的情况下处理它们,或者如果发现任何异常则将它们写入文件.
这太过于幻想了,还是有人因这样的事情而被骗了?
您可以f_locals在回溯中捕获帧上的变量:
import sys
import functools
def capturelocals(func):
@functools.wraps(func)
def wrapperfunc(*args, **kw):
try:
return func(*args, **kw)
except Exception:
_, _, tb = sys.exc_info()
try:
while tb.tb_next is not None:
tb = tb.tb_next # find innermost frame
locals = tb.tb_frame.f_locals
print locals
finally:
del tb # prevent leaking tracebacks
raise
return wrapperfunc
Run Code Online (Sandbox Code Playgroud)
为了证明它有效:
>>> @capturelocals
... def foobar():
... foo = 'bar'
... spam = 'eggs'
... raise ValueError('Bam!')
...
>>> foobar()
{'foo': 'bar', 'spam': 'eggs'}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in wrapperfunc
File "<stdin>", line 5, in foobar
ValueError: Bam!
Run Code Online (Sandbox Code Playgroud)