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 }
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 }
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!