Heim > Backend-Entwicklung > Golang > Wie kann ich mich von Paniken in Go-Goroutinen erholen?

Wie kann ich mich von Paniken in Go-Goroutinen erholen?

DDD
Freigeben: 2024-12-13 09:01:10
Original
534 Leute haben es durchsucht

How Can I Recover from Panics in Go Goroutines?

Generische Panikwiederherstellung in Go-Programmen

Bei der Arbeit mit Go-Routinen kann es vorkommen, dass Sie Abstürze oder Paniken abfangen und bewältigen möchten die darin auftreten, möglicherweise zur Meldung an einen Fehlerberichtsserver wie Sentry oder Raygun. Es ist jedoch wichtig zu beachten, dass sich eine Goroutine nicht von einer Panik in einer anderen Goroutine erholen kann.

Idiomatischer Ansatz

Der idiomatische Weg, damit umzugehen, besteht darin, Code in das einzufügen Funktion, die als Goroutine gestartet wird. Dazu gehört die Verwendung einer verzögerten Funktion, die „recover()“ aufruft und die Möglichkeit bietet, sich von einem Panikzustand zu erholen.

Betrachten Sie das folgende Beispiel:

go func() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Caught:", r)
        }
    }()

    panic("catch me")
}()
Nach dem Login kopieren

Dieser Code gibt die entsprechende Panik aus Nachricht bei der Ausführung.

Obwohl es unpraktisch ist, diesen Ansatz in jeder von Ihnen gestarteten Goroutine zu implementieren, können Sie den Prozess vereinfachen, indem Sie eine benannte Funktion definieren, die die Wiederherstellungsfunktionalität enthält. und rufen Sie diese Funktion innerhalb Ihrer Goroutine auf (mit einem verzögerten Aufruf).

func logger() {
    if r := recover(); r != nil {
        fmt.Println("Caught:", r)
    }
}
Nach dem Login kopieren

Durch den Aufruf dieser Funktion innerhalb eines verzögerten Abschlusses können Sie Paniksituationen auf prägnante Weise bewältigen.

go func() {
    defer logger()
    panic("catch me")
}()
Nach dem Login kopieren

Wrapper-Funktion

Für mehr Komfort können Sie eine Wrapper-Funktion erstellen, die die eigentliche Funktion als Eingabe verwendet und die Panik verwaltet Wiederherstellungsprozess. Diese Wrapper-Funktion kann wie folgt verwendet werden:

func wrap(f func()) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Caught:", r)
        }
    }()

    f()
}
Nach dem Login kopieren

Die Verwendung dieses Wrappers vereinfacht den Panikbehandlungsprozess noch weiter:

go wrap(func() {
    panic("catch me")
})
Nach dem Login kopieren

Zusätzliche Überlegungen

Die bereitgestellten Beispielcodes veranschaulichen Situationen, in denen eine Goroutine innerhalb der Funktion wrap() gestartet wird. Dadurch kann der Aufrufer feststellen, ob eine neue Goroutine erforderlich ist, indem er dem Aufruf von wrap() das Schlüsselwort go voranstellt. Die Funktion wrap() kann jedoch auch verwendet werden, um die Ausführung beliebiger Funktionen zu schützen, die als Eingabe übergeben werden, selbst wenn Sie diese nicht gleichzeitig in einer neuen Goroutine ausführen möchten.

Das obige ist der detaillierte Inhalt vonWie kann ich mich von Paniken in Go-Goroutinen erholen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage