Heim > Backend-Entwicklung > Golang > Wie gehe ich mit Panik in separaten Go-Routinen um?

Wie gehe ich mit Panik in separaten Go-Routinen um?

DDD
Freigeben: 2024-11-07 20:36:02
Original
486 Leute haben es durchsucht

How to Handle Panics in Separate Go Routines?

Umgang mit Panik bei Go-Routinen

Wenn bei einer Go-Routine eine Panik auftritt, ist es wichtig, richtig damit umzugehen. Durch die Verwendung der Wiederherstellungsfunktion kann der Panikwert effektiv abgerufen und entsprechend behandelt werden.

Ein gängiger Ansatz besteht darin, Paniken in der Hauptfunktion mithilfe verzögerter Funktionen zu behandeln. Wenn die Panik jedoch in einer separaten Goroutine auftritt, kann sie mit diesem Ansatz nicht erfasst werden.

Im gegebenen Beispiel:

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")
    defer func() {
        r := recover()
        if _, ok := r.(error); ok {
            fmt.Println("Recovered")
        }
    }()

    go handle(done)
    for {
        select {
        case <-done:
            return
        }
    }
}

func handle(done chan int64) {
    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}
Nach dem Login kopieren

Die Panik tritt in der Handle-Funktion innerhalb der Goroutine auf, aber Die verzögerte Wiederherstellungsfunktion in der Hauptfunktion kann es nicht erfassen. Dies liegt daran, dass die Wiederherstellung nur funktioniert, wenn sie in derselben Goroutine aufgerufen wird, in der die Panik ihren Ursprung hat.

Um dieses Problem zu beheben, verschieben Sie den verzögerten Wiederherstellungsfunktionsaufruf innerhalb der Handle-Funktion:

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")

    go handle(done)
    for {
        select {
        case <-done:
            return
        }
    }
}

func handle(done chan int64) {
    defer func() {
        r := recover()
        if _, ok := r.(error); ok {
            fmt.Println("Recovered")
        }
    }()

    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}
Nach dem Login kopieren

Damit Wenn in der Handle-Funktion eine Panik auftritt, wird sie von der verzögerten Wiederherstellungsfunktion innerhalb derselben Goroutine abgefangen und entsprechend verarbeitet.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Panik in separaten Go-Routinen um?. 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