Ich habe gerade mit Golang angefangen. Ich denke, dass es idiomatisch ist, eine Fehlervariable zu deklarieren und sie in Ihrer Fehlerstruktur zu verwenden, um festzustellen, was falsch gelaufen ist, wie es in geschieht strconv.go . Dort wird ErrRange
und ErrSyntax
deklariert, und Referenzen auf diese werden bei ihrer Rückgabe in NumError
structs gespeichert. Ich denke, dass der Grund dafür ist, dass dann die Adresse des Verweises auf den in NumError
gespeicherten Fehler mit den Variablen ErrRange
und ErrSyntax
verglichen werden kann, um festzustellen, welcher Fehlertyp zurückgegeben wurde.
Gibt es "Standard" solche deklarierten Fehlertypen? In Java zum Beispiel haben Sie Dinge wie java.lang.IllegalArgumentException
. Gibt es zum Beispiel ErrArgument
oder ErrUnsupportedOperation
, die ich in meinem eigenen Code verwenden kann, anstatt neue Fehlervariablen zu erstellen, die jedes Mal dasselbe bedeuten?
Es gibt einige übliche idiomatische Möglichkeiten, wie ein Paketautor Fehler zurückgeben kann.
Fehlervariablen behoben, normalerweise Err…
Fehlertypen, normalerweise …Error
Ad hoc errors.New
Werte nach Bedarf.
Verwendung von Fehlern, die in den Standardpaketen definiert sind. Gewöhnlich beschränkt auf einen kleinen Satz wie io.EOF
; In den meisten Fällen ist es besser, über Methode 1 selbst eine eigene Methode zu erstellen.
Beachten Sie, dass es manchmal bei der Implementierung einer Schnittstelle (z. B. eine Read
-Methode, um io.Reader
zu werden) am besten ist, passende Fehler zu verwenden (oder "erforderlich" durch die Spezifikation der Schnittstelle) ).
Erstellen Sie eine Schnittstelle wie net.Error
:
Oft verwenden Sie eine Mischung aus all diesen Möglichkeiten.
Das erste, zweite und fünfte wird bevorzugt, wenn Sie glauben, dass any Benutzer Ihres Pakets jemals auf bestimmte Fehler testen möchten. Sie erlauben Dinge wie:
%Vor%Der fünfte Weg (der nur eine Erweiterung des zweiten ist) erlaubt es, den Fehler für Verhalten / Typ wie folgt zu überprüfen:
%Vor% Das Problem mit der dritten Möglichkeit ist, dass es keinen vernünftigen Weg für einen Benutzer des Pakets gibt, um danach zu testen. (Es ist keine gute Idee, den Inhalt der von err.Error()
zurückgegebenen Zeichenfolge zu testen).
Es ist jedoch in Ordnung für die Fehler, von denen Sie nie erwarten, dass jemand es testen möchte.
Weiterführende Literatur:
Wie Sie gesehen haben, gibt es spezifische Fehler, die bestimmte Pakete verwenden. Im Paket database / sql definieren sie zum Beispiel:
%Vor% Wenn Sie also QueryRow
(was den Fehler bis Scan
verzögert) und dann Scan
ausführen, können Sie
os / exec hat var ErrNotFound = errors.New("executable file not found in $PATH")
encoding / json hat eine type UnmarshalTypeError
, die nur ein Typ ist, der die error
Schnittstelle implementiert.
Nein, während es keine "Standardfehler" gibt, können (und sollten Sie wahrscheinlich) bestimmte Fehlervariablen haben, die Sie wiederverwenden.
Sie könnten Ihr eigenes errorMsgs-Paket verwenden, in dem Sie häufige Fehler wiederverwenden können:
%Vor%Tags und Links go