Warum ist „return nil, err' in einer „defer'-Funktion, die zur Fehlerbehandlung in Go verwendet wird, falsch?

Linda Hamilton
Freigeben: 2024-11-14 12:10:02
Original
198 Leute haben es durchsucht

Why is `return nil, err` incorrect in a `defer` function used for error handling in Go?

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
    ...
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage