2009-09-08 5 views
20

Das ist eine ziemlich weit gefasste Frage, aber ich stoße immer noch darauf, wenn ich in Ruby programmiere. Ich komme aus einem weitgehend C- und Java-Hintergrund, wo ich, wenn ich eine Bibliotheksfunktion oder -methode verwende, die Dokumentation anschaue und sehe, was sie bei einem Fehler zurückliefert (normalerweise in C) oder welche Ausnahmen sie werfen kann (in Java).Wie geht man damit um, wenn man nicht weiß, welche Ausnahmen durch eine Bibliotheksmethode in Ruby ausgelöst werden können?

In Ruby scheint die Situation völlig anders. Gerade jetzt brauche ich einig JSON ich von einem Server empfangen zu analysieren:

data = JSON.parse(response) 

natürlich das erste, was ich denke, nach diesem Code zu schreiben ist, was passiert, wenn der Eingang schlecht ist? Wird parse bei einem Fehler auf Null gesetzt oder eine Ausnahme ausgelöst, und wenn ja, welche?

ich in der Dokumentation (http://flori.github.com/json/doc/JSON.html#M000022) und sehen einfach wie folgt:

„Analysieren Sie die JSON-String Quelle in eine Struktur Ruby-Daten und senden Sie es.“

Dies ist nur ein Beispiel für ein Muster, das ich in Ruby wiederholt durchlaufen habe. Ursprünglich dachte ich, es wäre ein Mangel an Dokumentation der Bibliothek, mit der ich arbeitete, aber jetzt fange ich an zu fühlen, dass dies Standard ist, und ich bin in einer etwas anderen Denkweise als Ruby-Programmierer. Gibt es eine Konvention, von der ich keine Ahnung habe?

Wie gehen Entwickler damit um?

(Und ja, ich habe mir den Code der Bibliotheksmethode angeschaut und kann eine Vorstellung davon bekommen, welche Ausnahmen ausgelöst werden, aber ich kann nicht 100% sicher sein und wenn es nicht dokumentiert ist, fühle ich mich unwohl.)

EDIT: Nach dem Betrachten der ersten beiden Antworten, lassen Sie mich das JSON-Parsing-Beispiel von oben fortsetzen.

Ich vermute, ich nicht tun sollte:

begin 
    data = JSON.parse(response) 
    raise "parse error" if data.nil? 
rescue Exception => e 
    # blahblah 
end 

, weil ich an den Code/Tests schauen und sehen, scheint es ein ParserError auf Fehler zu erhöhen (nil Rückkehr scheint nicht üblich zu sein in Ruby). Würde ich sagen die empfohlene Praxis richtig sein zu tun ist:

begin 
    data = JSON.parse(response) 
rescue JSON::ParserError => e 
    # blahblah 
end 

... basierend auf dem, was ich über ParserError, indem Sie durch den Code und Tests gelernt?

(I bearbeitet auch das Beispiel zu klären es eine Antwort von einem Server ist, dass ich das Parsen bin.)

Antwort

9

(Und ja, ich auf dem Code der Bibliothek Methode aussehen, und kann eine Vorstellung davon bekommen, was Ausnahmen angehoben werden, aber ich kann nicht zu 100% sicher sein, und wenn es nicht dokumentiert ist, fühle ich mich auf sie unbequem zu verlassen.)

Ich schlage vor, einen Blick auf die Tests zu werfen, da sie einige der "wahrscheinlichen" Szenarien zeigen werden und was sich ergeben könnte.Vergessen Sie nicht, dass gute Tests auch Dokumentation sind.

+1

einverstanden, schreiben Sie alle möglichen Spezifikationen/Tests für Ihre Eingabedaten in Ihre Methode und entwickeln Sie Ihre Anwendung, um diese Ausnahmen zu verwalten. – Jirapong

+0

Das ist ein guter Punkt, und ich werde von nun an die Tests betrachten. – user85509

2

Sie können nie sicher sein, was Ausnahmen angehoben werden kann, es sei denn, der Code-Bibliothek alle auffängt und wickelt sie dann . Ihre beste Wette ist es, eine gute Eingabe von Ihrem Code anzunehmen, indem Sie das, was reingeht, bereinigen und dann Ihre eigene Ausnahmebehandlung auf höherer Ebene verwenden, um schlechte Eingaben von Ihren Eingaben abzufangen.

+0

Ich glaube nicht, Das ist realistisch. In diesem speziellen Fall analysiere ich eine Antwort von einem Server. In dem seltenen Fall, dass der Server mir schlechte Daten geschickt hat, möchte ich zumindest in der Lage sein, fehlerfrei zu reagieren und "schlechte Antwort vom Server" zu sagen. – user85509

+0

In diesem Fall müssen Sie die allgemeine Ausnahme von dieser Methode abfangen und mit der entsprechenden Nachricht reraised. –

4

Ich denke, dass, wenn keine Dokumentation zur Verfügung gestellt wird, muss man auf so etwas wie dies verlassen:

begin 
    # code goes here 
rescue 
    # fail reason is in $! 
end 
4

Sollten Sie nicht gültig JSON-Daten zu verwerfen:

begin 
    res = JSON.parse(string) 
rescue JSON::ParserError => e 
    # string was not valid 
end 
Verwandte Themen