Próbuję złapać wyjątek w wątku i ponownie podnieść go w głównym wątku:Re-raise wyjątek Python i zachować ślad stosu
import threading
import sys
class FailingThread(threading.Thread):
def run(self):
try:
raise ValueError('x')
except ValueError:
self.exc_info = sys.exc_info()
failingThread = FailingThread()
failingThread.start()
failingThread.join()
print failingThread.exc_info
raise failingThread.exc_info[1]
to w zasadzie działa i daje następujący wynik:
(<type 'exceptions.ValueError'>, ValueError('x',), <traceback object at 0x1004cc320>)
Traceback (most recent call last):
File "test.py", line 16, in <module>
raise failingThread.exc_info[1]
Źródło wyjątku wskazuje jednak na linię 16, w której nastąpiło ponowne przebicie. Oryginalny wyjątek pochodzi z linii 7. Jak mam zmodyfikować główny nitkę tak, że wyjście brzmi:
Traceback (most recent call last):
File "test.py", line 7, in <module>
niesamowite, byłem ponownie podnosząc wyjątki od innych wątków też, ale nigdy nie poszedł tak daleko chcesz :) –
możliwy duplikat ["Wewnętrzny wyjątek" (z tracebackiem) w Pythonie?] (Http://stackoverflow.com/questions/1350671/inner-exception-with-traceback-in-python) –