Eine Exception eines Child Thread im Main Thread abfangen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

Servus,

wie der Titel es schon andeutet, würde mich interessieren, wie man am Besten eine Exception eines Child Thread im Main Thread abfangen kann. Ich habe mal versucht ein wirkliches Minimalbeispiel zu kredenzen, um es zu veranschaulichen.

Wie ihr unten seht, würde ich gerne irgendwie in 'main()' die Exception registrieren lassen. Aktuell bringt der try/except Block gar nichts und es wird eine Exception geworfen (Traceback siehe unten). Gibt es eine allgemein anerkannte Lösung für so ein Problem?

Danke schonmal für eure Hilfe und Anregungen.

Code: Alles auswählen

import time
from threading import Thread

def faulty_worker():
    time.sleep(1)
    raise Exception
    
def main():
    try:
        t = Thread(target=faulty_worker).start()
    except:
        print "Huzzah!"


if __name__ == '__main__':
    main()
Hier noch der Traceback des obigen Beispiels:

Code: Alles auswählen

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/home/nebelhom/SpyderWorkspace/pydf-chain/sandbox.py", line 50, in faulty_worker
    raise Exception
Exception
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Nebelhorn,

Threads sind ja gerade dazu da, dass sie nebeneinander herlaufen, dass also das Hauptprogramm nichts vom Thread mitkriegt. Wo soll also die Exception abgefangen werden, wenn das Hauptprogramm inzwischen an einer beliebigen Stelle sein kann?

Der normale Weg ist, die Exception im Thread abzufangen und entsprechend zu behandeln. Informationen über die erfolgreiche Abarbeitung eines Threads kann über Queues zum Hauptprogramm übermittelt werden.
Antworten