„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie man mit Paniken in Go-Routinen umgeht: Wie funktioniert der Wiederherstellungsumfang?

Wie man mit Paniken in Go-Routinen umgeht: Wie funktioniert der Wiederherstellungsumfang?

Veröffentlicht am 10.11.2024
Durchsuche:891

How to Handle Panics in Go Routines: Understanding Recover Scope?

Umgang mit Panikattacken in Go-Routinen

Go bietet die integrierten Panic()- und Recover()-Funktionen, um unerwartete Fehler und schwerwiegende Zustände zu verwalten Ausführen von Code. Um mit Paniks in einer Go-Routine umzugehen, ist es wichtig, den Umfang von „recover()“ zu verstehen.

Recover()-Bereich verstehen

recover() kann nur von Paniks wiederhergestellt werden innerhalb derselben Goroutine, die die Panik ausgelöst hat. Wenn in einer Goroutine ohne aktives „recover()“ eine Panik auftritt, stürzt das gesamte Programm ab.

Beispiel mit falscher Fehlerbehandlung

Das bereitgestellte Codebeispiel in der Frage kann eine Panik nicht behandeln, da „recover()“ in der Hauptroutine definiert ist, während die Panik in der Goroutine „handle()“ ausgelöst wird. Daher kann „recover()“ nicht auf den Panic-Wert zugreifen.

func main() {
    // ...

    go handle(done)
    // ...
}

func handle(done chan int64) {
    // ...
    fmt.Println(*a) // Panic here
    done 

Beispiel mit korrekter Fehlerbehandlung

Um in einer Goroutine ausgelöste Paniken zu behandeln, platzieren Sie „recover()“ in der Goroutine selbst.

func main() {
    // ...

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

    go handle(done)
    // ...
}

func handle(done chan int64) {
    // ...
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered")
        }
    }()

    fmt.Println(*a) // Panic here
    done 

Erläuterung

In diesem korrigierten Beispiel befindet sich „recover()“ jetzt innerhalb der handle()-Goroutine, sodass es die Panik erfassen kann, die durch die Dereferenzierung des Nullzeigers ausgelöst wird. Die Panik wird dann wiederhergestellt und die Meldung „Wiederhergestellt“ wird gedruckt.

Das Verständnis des Umfangs von „recover()“ ist für eine effektive Fehlerbehandlung in Go-Routinen von entscheidender Bedeutung. Platzieren Sie „recover()“ immer in derselben Goroutine, in der die Panik auftreten könnte, um unerwartete Bedingungen ordnungsgemäß zu bewältigen und zu melden.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3