2016-04-20 7 views
1

In Golang, ist es in Ordnung, die Funktionwenn kein Fehler Golang

err, value := function() 
if err == nil { 
    return value 
} 

statt, dies zu tun laufen:

err, value := function() 
if err != nil { 
    panic(err) 
} 
return err 

Wenn ja, ist es Zeit Vorteile/Boni?

Dies ist kein nicht schwerwiegender Fehler. Ich versuche, etwas in verschiedene Arten zu konvertieren, und ich bin mir nicht sicher, was ich verwenden soll.

+0

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

+0

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

+0

Aktualisierte Antwort mit Ihrem Anwendungsfall –

Antwort

1

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

Verwandte Themen