Ich fange gerade erst mit Go an. Mein Code fängt an, viel davon zu haben:
if err != nil {
//handle err
}
oder dieses
if err := rows.Scan(&some_column); err != nil {
//handle err
}
Gibt es einige gute Redewendungen / Strategien / Best Practices für die Überprüfung und Behandlung von Fehlern in Go?
BEARBEITEN, um zu verdeutlichen: Ich mache keine Bauchschmerzen oder schlage vor, dass das Go-Team sich etwas Besseres einfallen lässt. Ich frage, ob ich es richtig mache oder ob ich eine Technik verpasst habe, die die Community entwickelt hat. Vielen Dank an alle.
Antworten:
Ihr Code ist idiomatisch und meiner Meinung nach die beste verfügbare Methode. Einige würden sicher nicht zustimmen, aber ich würde argumentieren, dass dies der Stil ist, der in allen Standardbibliotheken in Golang zu finden ist . Mit anderen Worten, Go-Autoren schreiben die Fehlerbehandlung auf diese Weise.
quelle
Sechs Monate nachdem diese Frage gestellt wurde, schrieb Rob Pike einen Blog-Beitrag mit dem Titel Errors are Values .
Dort argumentiert er, dass Sie nicht in der vom OP dargestellten Weise programmieren müssen, und erwähnt mehrere Stellen in der Standardbibliothek, an denen sie ein anderes Muster verwenden.
Es ist eine gute Lektüre.
quelle
Ich würde der Antwort von jnml zustimmen, dass beide idiomatischer Code sind, und Folgendes hinzufügen:
Ihr erstes Beispiel:
ist idiomatischer, wenn es sich um mehr als einen Rückgabewert handelt. beispielsweise:
Ihr zweites Beispiel ist eine nette Abkürzung, wenn Sie sich nur mit dem
err
Wert befassen . Dies gilt, wenn die Funktion nur ein zurückgibterror
oder wenn Sie die zurückgegebenen Werte außer dem absichtlich ignorierenerror
. Als Beispiel wird dies manchmal mit den FunktionenReader
undWriter
verwendet, die eineint
der geschriebenen Bytes (manchmal unnötige Informationen) und Folgendes zurückgebenerror
:Die zweite Form wird als Verwendung einer if-Initialisierungsanweisung bezeichnet .
Soweit ich weiß, haben Sie in Bezug auf Best Practices (mit Ausnahme des Pakets "Fehler" , um neue Fehler zu erstellen, wenn Sie sie benötigen) so ziemlich alles behandelt, was Sie über Fehler in Go!
EDIT: Wenn Sie feststellen , wirklich nicht leben , ohne Ausnahmen, können Sie sie mit Mimik
defer
,panic
undrecover
.quelle
Ich habe eine Bibliothek für eine optimierte Fehlerbehandlung und das Weiterleiten durch eine Warteschlange von Go-Funktionen erstellt.
Sie finden es hier: https://github.com/go-on/queue
Es hat eine kompakte und eine ausführliche syntaktische Variante. Hier ist ein Beispiel für die kurze Syntax:
Bitte beachten Sie, dass es einen geringen Leistungsaufwand gibt, da Reflexion verwendet wird.
Auch dies ist kein idiomatischer Go-Code, daher sollten Sie ihn in Ihren eigenen Projekten verwenden oder wenn Ihr Team der Verwendung zustimmt.
quelle
Eine "Strategie" zur Behandlung von Fehlern in Golang und anderen Sprachen besteht darin, Fehler kontinuierlich im Aufrufstapel zu verbreiten, bis Sie im Aufrufstapel hoch genug sind, um diesen Fehler zu behandeln. Wenn Sie versucht haben, diesen Fehler zu früh zu beheben, wird der Code wahrscheinlich wiederholt. Wenn Sie zu spät damit umgehen, brechen Sie etwas in Ihrem Code. Golang macht diesen Prozess sehr einfach, da es sehr deutlich macht, ob Sie einen Fehler an einem bestimmten Ort behandeln oder weitergeben.
Wenn Sie den Fehler ignorieren, zeigt ein einfaches _ diese Tatsache sehr deutlich. Wenn Sie damit umgehen, ist klar, welcher Fehlerfall Sie behandeln, da Sie in der if-Anweisung nachsehen werden.
Wie oben erwähnt, ist ein Fehler eigentlich nur ein normaler Wert. Dies behandelt es als solches.
quelle
Die Go-Götter haben in Go 2 einen "Entwurfsentwurf" für die Fehlerbehandlung veröffentlicht. Ziel ist es, die Fehlersprache zu ändern:
Übersicht und Design
Sie wollen Feedback von Benutzern!
Feedback-Wiki
Kurz sieht es so aus:
UPDATE: Der Entwurfsentwurf wurde vielfach kritisiert, daher habe ich Anforderungen für die Fehlerbehandlung mit Go 2 mit einem Menü mit Möglichkeiten für eine mögliche Lösung entworfen.
quelle
Die meisten in der Industrie befolgen die in der Golang-Dokumentation genannten Standardregeln. Fehlerbehandlung und Go . Außerdem hilft es bei der Erstellung von Dokumenten für Projekte.
quelle
Im Folgenden ist mein Ansatz zur Reduzierung der Fehlerbehandlung für Go aufgeführt. Ein Beispiel ist das Abrufen von HTTP-URL-Parametern:
(Entwurfsmuster abgeleitet von https://blog.golang.org/errors-are-values )
Das Aufrufen für mehrere mögliche Parameter wäre wie folgt:
Dies ist keine Silberkugel. Der Nachteil ist, dass Sie nur den letzten Fehler erhalten können, wenn Sie mehrere Fehler hatten.
Aber in diesem Fall ist es relativ repetitiv und mit geringem Risiko, daher kann ich nur den letztmöglichen Fehler bekommen.
quelle
Du kannst Ihren Fehlerbehandlungscode auf ähnliche Fehler bereinigen (da Fehler Werte sind, müssen Sie hier vorsichtig sein) und eine Funktion schreiben, die Sie mit dem übergebenen Fehler aufrufen, um den Fehler zu behandeln. Sie müssen dann nicht jedes Mal "if err! = Nil {}" schreiben. Auch dies führt nur zu einer Bereinigung des Codes, aber ich denke nicht, dass dies die idiomatische Art ist, Dinge zu tun.
Nur weil du kannst, heißt das nicht, dass du es solltest .
quelle
goerr erlaubt es, Fehler mit Funktionen zu behandeln
quelle
Wenn Sie eine präzise Fehlerkontrolle wünschen, ist dies möglicherweise nicht die Lösung, aber für mich ist jeder Fehler meistens ein Show-Stopper.
Also benutze ich stattdessen Funktionen.
quelle
stderr
eher an als gehenstdout
, also einfachlog.Fatal(err)
oder verwendenlog.Fatalln("some message:", err)
. Da fast nichts anderes alsmain
eine solche Entscheidung treffen sollte, um das gesamte Programm zu beenden (dh Fehler von Funktionen / Methoden zurückgeben, nicht abbrechen), ist dies in seltenen Fällen das, was Sie tun möchten, es ist sauberer und besser, es explizit zu tun (dhif err := someFunc(); err != nil { log.Fatal(err) }
) anstatt über eine "Hilfs" -Funktion, die unklar ist, was sie tut (der Name "Err" ist nicht gut, gibt keinen Hinweis darauf, dass das Programm möglicherweise beendet wird).