Frage

    

Diese Frage bereits eine Antwort hier:

         

Es gibt einige ähnliche Fragen, aber keiner liefern die Antwort, die ich benötigen.

Wenn ich Threads über threading.Thread erstellen, die dann Ausnahmen auslösen, die nicht behandelte sind, werden diese Fäden beendet. Ich wünsche den Standard Ausdruck der Ausnahme Details mit dem Stack-Trace zu erhalten, sondern auch den gesamten Prozess zu bringen.

Ich habe angenommen, dass es möglich sein könnte, alle Ausnahmen in den Fäden zu fangen, und Reraise sie auf dem Haupt-Thread-Objekt, oder vielleicht ist es möglich, manuell die Standardausnahmebehandlung durchführt und dann eine SystemExit auf dem Haupt-Thread zu erhöhen .

Was ist der beste Weg, um dies zu realisieren?

War es hilfreich?

Lösung

Ich schrieb über Re-Auslösen von Ausnahmen in Python , darunter etwas sehr ähnlich dies als Beispiel.

Auf dem Arbeitsthread Sie dies tun (Python 2.x, siehe unten für Python 3.x-Version):

try:
    self.result = self.do_something_dangerous()
except Exception, e:
    import sys
    self.exc_info = sys.exc_info()

und auf dem Haupt-Thread Sie dies tun:

if self.exc_info:
    raise self.exc_info[1], None, self.exc_info[2]
return self.result

Die Ausnahme wird im Hauptthread erscheinen, als ob es in dem Arbeitsthread angehoben worden war.

Python 3.x:

try:
    self.result = self.do_something_dangerous()
except Exception as e:
    import sys
    self.exc_info = sys.exc_info()

und auf dem Haupt-Thread:

if self.exc_info:
    raise self.exc_info[1].with_traceback(self.exc_info[2])
return self.result

Andere Tipps

Die einzige Ausnahme ein sekundärer Thread im Hauptthread zuverlässig erhöhen kann, ist KeyboardInterrupt: die Art und Weise der sekundären Thread tut es durch den Aufruf der Funktion ist thread.interrupt_main() . Es gibt keine Möglichkeit, zusätzliche Informationen mit Ausnahme Objekt (für die Ausnahme über den Grund) zu assoziieren, das ausgelöst wird - letzteres ist immer nur eine schlichte KeyboardInterrupt. So müssen Sie sich diese Informationen bunkern woanders, z.B. auf eine eigene Instanz von Queue.Queue - dass Informationen könnten die Ergebnisse umfassen die sekundären Thread über sys.exc_info() bekommen können, und alles, was finden Sie nützliche natürlich.

Der Haupt-Thread müssen, dass zusätzliche Informationen erholen (und berücksichtigen, dass die Warteschlange leer ist, wenn die Tastatur-Interrupt tatsächlich aufgrund der Benutzer Schlagen Steuer-C oder dergleichen, so, Verwendung get_nowait und bereit sein, befassen sich mit einer Queue.Empty Ausnahme, zum Beispiel), das Format es jedoch, das Sie sich wünschen, und beenden (wenn alle sekundären Threads Daemon s, der ganze Prozess wird beendet, wenn der Haupt-Thread beendet wird).

Sehr leider die akzeptierte Antwort keine Antwort auf die Frage. Sie würden vielmehr Rohr die Ausnahmedetails in eine Warteschlange. Weitere Informationen finden sie unter: Fangen Ausnahme eines Threads in dem Anrufer Thread in Python

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top