Heim  >  Artikel  >  Backend-Entwicklung  >  Wie fängt man die Ausnahme eines Threads im Aufrufer-Thread in Python ab?

Wie fängt man die Ausnahme eines Threads im Aufrufer-Thread in Python ab?

Susan Sarandon
Susan SarandonOriginal
2024-11-09 09:25:02283Durchsuche

How to Catch a Thread's Exception in the Caller Thread in Python?

Abfangen einer Thread-Ausnahme im Aufrufer-Thread

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.

Verstehen des Problems

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.

Auflösen der Ausnahme

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:

  • ExcThread: Eine benutzerdefinierte Thread-Klasse, die Ausnahmeinformationen in einer Nachrichtenwarteschlange namens Bucket platziert.
  • main: Der Aufrufer-Thread, der die Warteschlange mithilfe einer nicht blockierenden Get-Operation kontinuierlich auf Ausnahmen überprüft.
  • exc_type, exc_obj, exc_trace: Inhalte der abgerufenen Ausnahme, die entsprechend behandelt werden können.

Fazit

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn