Multithread-Programmierung, gleichzeitig ausgeführte Aufgaben sorgen für Effizienz bei der Handhabung komplexer Vorgänge. Allerdings kann die Verwaltung von in Threads auftretenden Ausnahmen eine Herausforderung darstellen. In Python verarbeitet der Standardblock „try-exclusive“ möglicherweise keine Ausnahmen, die in einem untergeordneten Thread ausgelöst werden. In diesem Artikel wird eine Technik zum Erfassen von Ausnahmen aus einem Thread im Aufrufer-Thread untersucht, die Entwicklern die Möglichkeit gibt, sie effektiv zu behandeln.
Stellen Sie sich das folgende Szenario vor: Ein Skript führt eine Datei aus Kopieren in einem separaten Thread, mit der Absicht, Fortschrittsindikatoren anzuzeigen. Wenn das Kopieren der Datei jedoch fehlschlägt, wird innerhalb des Threads eine Ausnahme ausgelöst. Der folgende Codeausschnitt versucht, diese Ausnahme zu behandeln:
try: threadClass = TheThread(param1, param2, etc.) threadClass.start() ##### **Exception takes place here** except: print "Caught an exception"
Leider schlägt dieser Ansatz fehl, da die „start“-Methode sofort zurückkehrt, was dazu führt, dass die Ausnahme im Kontext des untergeordneten Threads auftritt. Der Ausnahme-Stack-Trace bleibt innerhalb dieses Threads isoliert, sodass er für den Aufrufer-Thread nicht zugänglich ist.
Um dieses Problem zu beheben, besteht ein vielversprechender Ansatz in der Verwendung von Message Passing. Durch den Einsatz einer Nachrichtenwarteschlange können Ausnahmen vom untergeordneten Thread an den aufrufenden Thread kommuniziert werden. Hier ist eine Beispielimplementierung:
import sys import threading import queue class ExcThread(threading.Thread): def __init__(self, bucket): threading.Thread.__init__(self) self.bucket = bucket def run(self): try: raise Exception('An error occured here.') except Exception: self.bucket.put(sys.exc_info()) def main(): bucket = queue.Queue() thread_obj = ExcThread(bucket) thread_obj.start() while True: try: exc = bucket.get(block=False) except queue.Empty: pass else: exc_type, exc_obj, exc_trace = exc # deal with the exception print exc_type, exc_obj print exc_trace thread_obj.join(0.1) if thread_obj.isAlive(): continue else: break if __name__ == '__main__': main()
Erklärung:
Durch den Einsatz von Message-Passing-Techniken wird es möglich, Ausnahmen aus einem untergeordneten Thread zu erfassen und zu behandeln effektiv im Anrufer-Thread. Dies ermöglicht Entwicklern, potenzielle Fehler schnell zu beheben, was zu robusteren und reaktionsschnelleren Multithread-Anwendungen führt.
Das obige ist der detaillierte Inhalt vonWie fängt man die Ausnahme eines Threads im Aufrufer-Thread in Python ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!