Heim >Backend-Entwicklung >Golang >Wie gehe ich mit Paniken um und verschiebe Rückgaben in Go-Funktionen?

Wie gehe ich mit Paniken um und verschiebe Rückgaben in Go-Funktionen?

DDD
DDDOriginal
2024-11-15 05:35:02385Durchsuche

How to Handle Panics and Defer Returns in Go Functions?

Aufschieben einer Rückkehr in Go

In Go ermöglicht die Defer-Anweisung, die Ausführung einer Funktion zu verschieben, bis die umgebende Funktion zurückkehrt. Dadurch können Bereinigungsaufgaben auch im Panikfall ausgeführt werden, der auftreten kann, wenn während der Laufzeit nicht behebbare Fehler auftreten.

Beachten Sie den folgenden Codeausschnitt, der versucht, einen Fehler von einer Funktion zurückzugeben, wenn diese in Panik gerät:

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
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function
}

Dieser Code funktioniert jedoch nicht wie vorgesehen. Die Return-Anweisung innerhalb der verzögerten Funktion ändert nur die lokalen Variablen err und rep innerhalb der Funktion und gibt sie nicht tatsächlich außerhalb der Funktion zurück.

Um dieses Problem zu beheben, können wir die Wiederherstellungsfunktion innerhalb der verzögerten Funktion verwenden Rufen Sie den Panikwert ab und legen Sie den Fehlerparameter entsprechend fest. Zusätzlich sollten wir den Typ des Panikwerts überprüfen und ihn gegebenenfalls in einen Fehler umwandeln.

Hier ist ein aktualisierter Code:

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        rep = nil
    }
}()

Dieser Code stellt sicher, dass der Fehlerparameter auf gesetzt ist Der entsprechende Fehler wird basierend auf dem Panikwert angezeigt. Außerdem wird der Rep-Parameter ungültig gemacht, um zu verhindern, dass ein unvollständiger Bericht zurückgegeben wird.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Paniken um und verschiebe Rückgaben in Go-Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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