提高了exception
我想跳进那个框架。为了更好地解释我的意思是我写这篇兆瓦:如何从异常“跳”到堆栈帧?
假设我有以下代码:
from multiprocessing import Pool
import sys
# Setup debugger
def raiseDebugger(*args):
""" http://code.activestate.com/recipes/65287-automatically-start-the-
debugger-on-an-exception/ """
import traceback, pdb
traceback.print_exception(*args)
pdb.pm()
sys.excepthook = raiseDebugger
# Now start with the question
def faulty(i):
return 1/i
with Pool() as pool:
pool.map(faulty, range(6))
这并不奇怪导致:
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "/home/bin/conda/lib/python3.5/multiprocessing/pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "/home/bin/conda/lib/python3.5/multiprocessing/pool.py", line 44, in mapstar
return list(map(*args))
File "test2.py", line 19, in faulty
return 1/i
ZeroDivisionError: division by zero
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "test2.py", line 23, in <module>
pool.map(faulty, range(6))
File "/home/bin/conda/lib/python3.5/multiprocessing/pool.py", line 260, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "/home/bin/conda/lib/python3.5/multiprocessing/pool.py", line 608, in get
raise self._value
ZeroDivisionError: division by zero
> /home/bin/conda/lib/python3.5/multiprocessing/pool.py(608)get()
-> raise self._value
(Pdb)
我们调试,我想这个问题“跳转”到最初引发exception
(ZeroDivisionError
)的帧中。
最初的例外仍然可以在self._value
下完成self._value.__traceback__
。
谢谢你的回答。我用我的例子尝试过,但是'self._value .__ context__'是'None'。这是由于这样一个事实,即异常被提出而不是重新加注(不加引发地提出)? –
哦,嗯,远程回溯看起来像是一个字符串,但是考虑到你得到了什么(例外是'self._value'),你可能想用'self._value .__ traceback__'来完成。对不起,我的答案没有更清楚。 – metatoaster
我试过了。然而它在主进程中用'raise self._value'加载框架。我想这是由于多处理造成的限制。我绝对从你的答案中学到了一些东西,并会接受它,除非有人在第二天找到解决问题的办法。 –