Python:从multiprocessing.Process中获取回溯
|
我试图从multiprocessing.Process获取一个追溯对象。
不幸的是,通过管道传递异常信息不起作用,因为不能对回溯对象进行腌制:
def foo(pipe_to_parent):
try:
raise Exception(\'xxx\')
except:
pipe_to_parent.send(sys.exc_info())
to_child, to_self = multiprocessing.Pipe()
process = multiprocessing.Process(target = foo, args = (to_self,))
process.start()
exc_info = to_child.recv()
process.join()
print traceback.format_exception(*exc_info)
to_child.close()
to_self.close()
追溯:
Traceback (most recent call last):
File \"/usr/lib/python2.6/multiprocessing/process.py\", line 231, in _bootstrap
self.run()
File \"/usr/lib/python2.6/multiprocessing/process.py\", line 88, in run
self._target(*self._args, **self._kwargs)
File \"foo\", line 7, in foo
to_parent.send(sys.exc_info())
PicklingError: Can\'t pickle <type \'traceback\'>: attribute lookup __builtin__.traceback failed
还有另一种访问异常信息的方法吗?我想避免传递格式化的字符串。
没有找到相关结果
已邀请:
6 个回复
倪蕊悲潍
,您可以传递包装的异常并在以后重新引发它们:
因此,如果在远程进程中捕获到异常,请用with4ѭ将其包装,然后将其传递回去。在主过程中调用ѭ5即可完成工作。
田损比报
中使用的一个函数示例:
您得到的是一个堆栈跟踪,其中另一个格式化的堆栈跟踪作为错误消息,这有助于调试。
恋裂
的前两项和预格式化的追溯信息:
这给你:
然后,您将能够获取有关异常原因的更多信息(文件名,引发异常的行号,方法名称和引发异常的语句)
蹄寄噬非芹
的
方法返回完整的追溯,请参阅http://bugs.python.org/issue13831。 Python 2 使用“ 15”(表示格式化的expetion)获取回溯字符串。 如下制作装饰器会更加方便。
例:
装饰器的追溯:
没有装饰器的回溯:
俺呵誓放胳
函数保持不变,并将其包装在
/
中,以存储要重新引发的异常。
例
坛沤疲撑拆
用法: