Eine Panik ähnelt einer Ausnahme, wird aber nicht an den Anrufer weitergegeben (auch wenn Sie Panik auslösen, passiert es dann und dort; Sie müssen nicht warten). Sie sollten mit dem ersten Beispiel Ihres Codes gehen, wo Sie eine Aktion versuchen, fehlschlagen und fortfahren können.
func main() {
s1 := rand.NewSource(time.Now().UnixNano())
r1 := rand.New(s1)
// Generate some random numbers, and call into add()
for i := 0; i < 10; i++ {
s, err := add(r1.Intn(100), r1.Intn(100))
if err != nil {
fmt.Println(err)
continue
}
fmt.Println(s)
}
}
// Error if we get a sum over 100
func add(a int, b int) (int, error) {
s := a + b
if s > 100 {
return s, errors.New("Hey doofus, error!")
}
return s, nil
}
Wenn Sie in diesem Beispiel in Panik zu geraten waren, würden Sie es-- getan werden (versuchen Sie stattdessen ein Fehler tun Panik der Rückkehr („einige Fehler“). Aber stattdessen bestimmen wir ein Fehler ist, und wir können versuchen, eine andere Zufallszahl zu erzeugen.
Wie andere gesagt haben, wenn Sie einen Anwendungsfall, in dem Sie können erholen nicht (sagen Sie aus einer Datei zu lesen versuchten, aber die Datei nicht Sie könnten entscheiden, dass es besser ist, in Panik zu geraten. Aber wenn Sie einen langwierigen Prozess haben (wie eine API), wollen Sie trotz aller Fehler weitermachen.
GoPlay hier: http://play.golang.org/p/ThXTxVfM6R
OP hat seinen Beitrag mit einem Anwendungsfall aktualisiert - er versucht, in einen Typ zu konvertieren. Wenn Sie in dieser Funktion in Panik geraten würden, wären Sie tot im Wasser. Stattdessen möchten wir einen Fehler zurückgeben und den Anrufer entscheiden lassen, was mit dem Fehler geschehen soll. Nehmen Sie dies als Beispiel:
func interfaceToString(i interface{}) (string, error) {
if i == nil {
return "", errors.New("nil interface")
}
switch i.(type) {
case string:
return i.(string), nil
case float64:
return strconv.Itoa(int(i.(float64))), nil
case int:
return strconv.Itoa(i.(int)), nil
}
return "", errors.New(fmt.Sprintf("Unable to convert %v", i))
}
GoPlay hier: http://play.golang.org/p/7y7v151EH4
Ich habe nachgedacht über. Das Problem, wie ich es sehe, ist, dass Sie im ersten Beispiel die Logging/Handle-Fehler umgehen. Aber wenn Sie nur planen, zu diesem Zeitpunkt in Panik zu geraten und das Programm zu beenden, ist es vielleicht nicht so wichtig. – Snowman
Es hängt wirklich von der Art des Fehlers ab. Go ermutigt zu einer unverzüglichen Fehlerbehandlung, anders als Java, wo Leute häufig Versuche/Fänge verschachteln und Ausnahmen zulassen, bevor sie verarbeitet werden. Wenn es sich um einen fatalen Fehler handelt (so wie das Programm nicht wiederhergestellt werden kann), sollten Sie wahrscheinlich in Panik geraten. Wenn es ein Fehler ist, den Sie antizipieren und mildern können, sollten Sie nicht in Panik geraten. Die Verwendung von panic/recover als eine Art Catch für unvorhergesehene Fehler ist ziemlich üblich und ich würde den Einsatz von Panik für diese Art von Umständen reservieren. – evanmcdonnal
Aktualisierte Antwort mit Ihrem Anwendungsfall –