Heim >Backend-Entwicklung >Golang >Können Defer-Anweisungen verwendet werden, um Rückgabewerte in in Panik geratenen Funktionen zu manipulieren?

Können Defer-Anweisungen verwendet werden, um Rückgabewerte in in Panik geratenen Funktionen zu manipulieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-12 17:18:01849Durchsuche

Can Defer Statements Be Used to Manipulate Return Values in Panicked Functions?

Rückgabewerte mit Defer manipulieren

In Go kann die Defer-Anweisung verwendet werden, um eine Funktion auszuführen, nachdem die umgebende Funktion zurückgegeben wurde. Mit diesem Mechanismus können Sie Bereinigungsaufgaben erledigen oder Aktionen ausführen, selbst wenn ein Fehler auftritt. Es gibt jedoch eine Einschränkung, wenn versucht wird, einen Fehlerwert von einer Funktion zurückzugeben, die in Panik gerät und in einer Defer-Anweisung eingeschlossen ist.

Beachten Sie den folgenden Codeausschnitt:

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.")
    // Remaining function code...
}

Die Absicht ist um einen Fehler zurückzugeben, wenn die getReport-Funktion in Panik gerät. Dieser Ansatz funktioniert jedoch nicht, da Verzögerungsfunktionen die Anzahl der Rückgabewerte in der umgebenden Funktion nicht ändern können. Stattdessen können sie nur die Werte der vorhandenen Rückgabeparameter ändern.

Um dieses Problem zu beheben, sollte die Defer-Funktion den Rückgabeparameter „err“ ändern, anstatt zu versuchen, einen neuen Fehlerwert zurückzugeben:

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

Mit dieser Änderung aktualisiert die Defer-Funktion den Rückgabeparameter err und setzt rep auf Null, um eine Fehlerbedingung anzuzeigen. Dadurch kann die umgebende Funktion den geänderten Fehlerwert zurückgeben.

Das obige ist der detaillierte Inhalt vonKönnen Defer-Anweisungen verwendet werden, um Rückgabewerte in in Panik geratenen Funktionen zu manipulieren?. 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