长时间运行的python脚本的故障保护

长时间运行的python脚本的故障保护

这可能是有史以来最愚蠢的问题,但我想知道是否有办法在函数(最好是decorator)周围编写包装器,以便在该函数中引发异常时捕获局部变量的内部状态。它会在创建本地变量时捕获它们,对它们进行pickle,然后在没有引发异常的情况下处理它们,或者在发现异常时将它们写入文件。
这是不是太离谱了,还是有人拿这样的东西来糊弄?

最佳答案

您可以捕获f_locals variable on a frame in the traceback

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

为了证明它是有效的:
>>> @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!

关于python - 长时间运行的python脚本的故障保护,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14719363/

10-10 18:20