Имея поднятый exception
Я хотел бы прыгнуть в эту рамку. Чтобы лучше объяснить, что я имею в виду, я написал эту MWe:Как я могу «прыгать» в стеке из исключения?
Предполагая, что у меня есть следующий код:
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))
который Unsurprisingly приводит к:
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' в основном процессе. Я думаю, это ограничение из-за многопроцессорности. Я определенно узнал что-то из вашего ответа и примет его, если кто-то не найдет способ для моей проблемы в течение следующего дня. –