Go - mehrere Fehler elegant behandeln?

8

Gibt es eine Möglichkeit, diesen (IMO) schrecklich aussehenden Code aufzuräumen?

%Vor%

Insbesondere spreche ich über die Fehlerbehandlung. Es wäre schön, in der Lage zu sein, alle Fehler auf einmal zu behandeln.

    
Matthew H 13.03.2013, 22:06
quelle

4 Antworten

14
%Vor%     
zzzz 13.03.2013, 22:21
quelle
13

Platzieren Sie das Ergebnis in einem Slice anstelle von Variablen, legen Sie die Anfangswerte in einen anderen Slice, um ihn bei einer Iteration zu iterieren und zurückzugeben, falls ein Fehler auftritt.

%Vor%

Sie könnten sogar ein Array wiederverwenden, anstatt zwei Scheiben zu haben.

%Vor%

Dies erfordert natürlich eine Typassertion, um die Ergebnisse zu verwenden.

    
the system 13.03.2013 22:18
quelle
7

Definieren Sie eine Funktion.

%Vor%

Sie haben nichts darüber gesagt, wie Ihre Fehlerbehandlung funktionieren soll. Scheitern, scheitern alle? Zuerst versagen? Erfolge sammeln oder werfen?

    
jorelli 13.03.2013 22:28
quelle
5

Ich glaube, dass die anderen Antworten hier für Ihr spezifisches Problem korrekt sind, aber allgemeiner gesagt, panic kann verwendet werden, um die Fehlerbehandlung zu verkürzen, während es immer noch eine gut funktionierende Bibliothek ist. (d. h. nicht panic ing über Paketgrenzen hinweg.)

Überlegen Sie:

%Vor%

Dieser Code verwendet mustMarshal bis panic immer dann, wenn ein Problem beim Marshallen eines Werts auftritt. Aber die encodeAll Funktion wird recover von der Panik und gibt es als normalen Fehlerwert zurück. Der Klient ist in diesem Fall niemals der Panik ausgesetzt.

Aber das kommt mit einer Warnung: Die Verwendung dieses Ansatzes ist nicht idiomatisch. Es kann auch schlechter sein, da es sich nicht gut eignet, um jeden individuellen Fehler speziell zu behandeln, sondern mehr oder weniger, um jeden Fehler gleich zu behandeln. Aber es hat seinen Nutzen, wenn es Unmengen von Fehlern gibt. Als Beispiel verwende ich diese Art von Ansatz in einer Webanwendung, bei der ein Top-Level-Handler verschiedene Arten von Fehlern abfangen und sie dem Benutzer (oder einer Protokolldatei) abhängig von der Art des Fehlers anzeigen kann.

>

Es sorgt für einen Fehlercode, wenn es viel Fehlerbehandlung gibt, aber bei dem Verlust von idiomatic Go und speziellem Umgang mit jedem Fehler. Ein weiterer Nachteil ist, dass es etwas verhindern könnte, dass in Panik geraten könnte. (Dies kann jedoch mit einem eigenen Fehlertyp trivial gelöst werden.)

    
BurntSushi5 14.03.2013 17:59
quelle

Tags und Links