Go: Panik mit Zurückstellen behandeln
Panik und Zurückstellen in Go bieten einen Mechanismus, um Fehler elegant zu behandeln und Ressourcen zu bereinigen. Die Verwendung von „Defer“ und „Panic“ für die Fehlerbehandlung bedarf jedoch einer Klärung.
Beachten Sie den folgenden Code:
func getReport(filename string) (rep report, err error) { rep.data = make(map[string]float64) defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) err, _ = r.(error) return nil, err // Code 1 } }() panic("Report format not recognized.") // rest of the getReport function, which can try to out-of-bound-access a slice ... }
Die Absicht hier ist, einen Fehler zurückzugeben, wenn die Funktion in Panik gerät. Die Defer-Funktion verwendet jedoch return nil, err (markiert als Code 1), um von der aktuellen Funktion zurückzukehren. Dies ist nicht der richtige Ansatz.
In einer Defer-Funktion können Sie die zurückgegebenen Parameter ändern, aber Sie können keinen neuen Satz von Werten zurückgeben. Um dies zu beheben, ersetzen Sie Code 1 durch:
rep = nil err = errors.New(r.(string)) return
Dadurch wird der Fehler korrekt festgelegt und der Bericht ungültig gemacht.
Außerdem ist es wichtig zu beachten, dass der von „recover()“ zurückgegebene r-Wert lautet vom Typ interface{}. Im obigen Code handelt es sich um einen Typ, der einen Fehler bestätigt. Wenn der Panikwert kein Fehler ist, sollten Sie eine passendere Typzusicherung verwenden oder ihn als unbekannte Panik behandeln.
Das obige ist der detaillierte Inhalt vonWarum ist „return nil, err' in einer „defer'-Funktion, die zur Fehlerbehandlung in Go verwendet wird, falsch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!