Die Verschachtelungsfunktion ruft GO auf

8

Nehmen wir an, wir wollen folgende Berechnung implementieren:

outval / err = f3(f3(f1(inval))

wobei jedes von f1 , f2 , f3 zu diesem Zeitpunkt mit einem Fehler fehlschlagen kann, stoppen wir die Berechnung und setzen err auf den Fehler, der von der fehlerhaften Funktion zurückgegeben wird. (Natürlich kann die Verschachtelung beliebig lang sein)

In Sprachen wie C ++ / JAVA / C # kann es leicht gemacht werden, indem f1 , f2 und f3 eine Exception werfen und die Berechnung in einen try-catch-Block einschließen, während wir es in Sprachen wie Haskell können Verwenden Sie stattdessen Monaden.

Jetzt versuche ich, es in GO zu implementieren, und der einzige Ansatz, den ich mir vorstellen kann, ist offensichtlich, wenn - sonst Leiter, die ziemlich ausführlich ist. Ich habe kein Problem, wenn wir die Aufrufe nicht verschachteln können, aber meiner Meinung nach fügt das Hinzufügen einer Fehlerüberprüfung nach jeder Zeile im Code hässlich aus und es unterbricht den Fluss. Ich würde gerne wissen, ob es einen besseren Weg gibt.

Bearbeiten: Bearbeiten nach dem Kommentar von peterSO
Unten ist das konkrete Beispiel und die einfache Implementierung

%Vor%

Was ich zu illustrieren versuche, ist, dass Funktion calc möglicherweise einige Berechnungen mit Hilfe von Bibliotheksfunktionen durchführt, die fehlschlagen können, und Semantik ist, wenn ein Aufruf fehlschlägt. calc verbreitet den Fehler an den Aufrufer (ähnlich wie die Ausnahme nicht behandelt wird). Meiner Meinung nach ist der Code für calc hässlich.

In diesem speziellen Fall, in dem alle Bibliotheksfunktionen genau die gleiche Signatur haben, können wir den Code verbessern (ich verwende die Idee von Ссылка )

%Vor%

Dann können wir calc als

definieren %Vor%

oder als

%Vor%

Aber ohne Generika-Unterstützung bin ich mir nicht sicher, wie ich diesen Ansatz für einen Satz von Bibliotheksfunktionen verwenden kann.

    
Suyog 10.06.2012, 08:42
quelle

6 Antworten

5

Die Diskussion zwischen Fehlern und Ausnahmen ist lang und langwierig. Ich werde deshalb nicht darauf eingehen.

Die einfachste Antwort auf Ihre Frage betrifft die integrierten Funktionen defer , panic und recover von Go, wie in dieses Blog Beitrag. Sie können Verhalten ähnlich wie Ausnahmen bieten.

%Vor%     
jimt 10.06.2012, 09:24
quelle
7

Wenn Sie das wirklich können, können Sie eine Compose-Funktion verwenden.

%Vor%

In den meisten Fällen möchten Sie jedoch wahrscheinlich einfacher sein, da es für andere möglicherweise schwierig ist, Ihren Code zu verstehen, wenn er darauf stößt.

    
Jeremy Wall 10.06.2012 18:49
quelle
7

Erstens, eine erweiterte Version des Try-Catch-Stils, an den Sie gewöhnt sind, der sich offensichtlich aus jimts Antwort und PeterSOs Antwort entlehnt.

%Vor%

Sie könnten also protestieren, dass Sie nach etwas einfacherem gefragt haben, und das ist es nicht. Kein Argument im Großen und Ganzen, aber wenn die Bibliothek alle Rückgabewerte verarbeitet und Sie Funktionsaufrufe ohne die Fehlerwerte verketten möchten, besteht die Lösung darin, die Bibliotheksfunktionen zu umbrechen, und die Wrapper sind sehr dünn und einfach zu schreiben. Der einzige andere schwierige Teil ist diese verzögerte Funktion, aber es ist ein Muster, das Sie lernen und wiederverwenden können und es sind nur ein paar Zeilen Code.

Ich möchte diese Lösung nicht zu sehr fördern, weil sie nicht oft verwendet wird. Es ist jedoch ein gültiges Muster, und es gibt einige Anwendungsfälle, wo es angebracht ist.

Fehlerbehandlung ist ein großes Thema, wie Jimt erwähnt. "Was sind gute Möglichkeiten, Fehler in Go zu beheben?" wäre eine gute Frage für SO außer für das Problem, dass es das "ganze Buch" kriiteon verfehlt. I kann sich ein ganzes Buch zum Thema Fehlerbehandlung in Go vorstellen.

Stattdessen gebe ich meine allgemeine Beobachtung, dass, wenn Sie einfach anfangen, mit Fehlerwerten zu arbeiten, anstatt zu versuchen, sie verschwinden zu lassen, nach einer Weile beginnen Sie, die Vorteile zu verstehen, dies zu tun. Was aussieht wie eine ausführliche Ladder of if-Anweisungen in einem Spielzeug-Beispiel, wie wir es hier verwendet haben, könnte immer noch wie eine ausführliche Leiter von if-Anweisungen aussehen, wenn Sie es erstmals in einem realen Programm schreiben. Wenn Sie jedoch tatsächlich mit diesen Fehlern umgehen müssen, kommen Sie zurück zum Code und sehen ihn plötzlich als Stubs, die darauf warten, dass Sie mit echtem Code zur Fehlerbehandlung arbeiten. Sie können sehen, was zu tun ist, weil der Code, der den Fehler verursacht hat, genau dort ist. Sie können einen Benutzer daran hindern, eine obskure Fehlermeldung auf niedriger Ebene zu sehen und stattdessen etwas Sinnvolles anzuzeigen. Sie als Programmierer werden aufgefordert, das Richtige zu tun, anstatt eine Standard-Sache zu akzeptieren.

Für umfassendere Antworten ist eine gute Ressource der Artikel Fehlerbehandlung und Go . Wenn Sie die Go-Nuts-Nachrichten durchsuchen, gibt es lange Diskussionen darüber auch dort. Die Funktionen in der Standardbibliothek rufen sich gegenseitig ziemlich (Überraschung) auf, und so enthält der Quellcode der Standardbibliothek viele Beispiele für Handhabungsfehler. Dies sind hervorragende Beispiele zum Studium, da der Code von Go-Autoren geschrieben wurde, die diesen Programmierstil für das Arbeiten mit Fehlerwerten propagieren.

    
Sonia 11.06.2012 02:00
quelle
0

Ohne ein konkretes Beispiel kippen Sie gegen Windmühlen. Zum Beispiel geben fn-Funktionen nach Ihrer Definition einen Wert und einen Fehler zurück. Die Fn-Funktionen sind Paketfunktionen, deren Signatur nicht geändert werden kann. Verwenden Sie Ihr Beispiel,

%Vor%

Wie werden Sie Ihr Beispiel zum Kompilieren und Ausführen bekommen?

    
peterSO 10.06.2012 13:06
quelle
0

Mailing thread gefunden zu diesem Thema. Hinzufügen als Referenz.

    
Suyog 13.06.2012 07:34
quelle
0

Schade, dass dieser schon geschlossen ist ... Das:

%Vor%

ist kein Beispiel für Verkettung, sondern für Verschachtelung. Die Verkettung sollte ungefähr so ​​aussehen:

%Vor%

Hier ist ein funktionierendes Beispiel .

    
Richard 21.06.2013 19:53
quelle

Tags und Links