Go: Rückkehr von Defer
Möchte ich auf einen Fehler zurück, der von einer Funktion, wenn es Panik (im Gehen):
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, which can try to out-of-bound-access a slice
...
}
Ich anscheinend falsch verstanden habe, das Konzept der Panik und zu verschieben. Kann jemand mich aufklären?
Kommentar zu dem Problem
Panik ist ein exception-handling-system, sondern Gehen den Weg der Umgang mit fehlerhaften Bedingungen ist so konzipiert, dass Sie sollten nicht in Panik geraten. Denken Sie an die Panik als das äquivalent zu einer RuntimeException in java – Panik-nur, wenn Sie nicht soll den Fehler beheben.
Auch, die Funktion, Die Sie aufrufen, mit verschieben ist eine Funktion auf seine eigene. Es ist return-Wert keine Auswirkungen auf die umliegenden Funktion und verworfen, statt.
Es ist erwähnenswert, für den Eintrag hier, während Panik bestimmt sind, werden Fälle, die nicht erfordern in der Regel "fangen", die ich gesehen habe mehrere Szenarien, in denen etwas in Panik tief in fremden code (eine Bibliothek mit einem Fehler, z.B.) und es sollte nicht beenden Sie Ihre Anwendung, sondern nur gemeldet werden, dass ein Versagen der Bibliothek zu tun, seine Sache ordentlich. Die vernünftige Sache zu tun ist, erholen sich von der Panik und schicken Sie es als einen Fehler. Es ist nicht ideal, aber angesichts der situation scheint es sinnvoll.
InformationsquelleAutor der Frage jrichner | 2013-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
In eine latente Funktion, die Sie ändern können Sie die zurückgegebenen Parameter, aber Sie können nicht wieder eine neue Reihe. So eine einfache änderung zu dem, was Sie haben, damit es funktioniert.
Gibt es ein weiteres problem mit dem, was Sie schrieb, nämlich, dass die Sie haben paniced mit einem
string
aber erwarten, dass einerror
in die Art Ihrer Geltendmachung.Hier ist ein fix für diese beiden (Spielen)
InformationsquelleAutor der Antwort Nick Craig-Wood