21

これはやや大雑把な質問ですが、Ruby でプログラミングするときに常に遭遇する質問です。私は主に C と Java のバックグラウンドを持っています。ライブラリ関数またはメソッドを使用するときは、ドキュメントを見て、エラー時に返されるもの (通常は C) や、スローされる可能性のある例外 (Java) を確認します。

Ruby では状況がまったく異なるようです。ここで、サーバーから受け取った JSON を解析する必要があります。

data = JSON.parse(response)

当然、このコードを書いた後に最初に考えるのは、入力が悪い場合はどうなるかということです。エラー時に nil を返すか、何らかの例外を発生させますか?parseもしそうなら、どれですか?

ドキュメント(http://flori.github.com/json/doc/JSON.html#M000022)を確認すると、次のようになります。

「JSON 文字列ソースを Ruby データ構造に解析して返します。」

これは、私が Ruby で繰り返し遭遇したパターンのほんの一例です。当初、これは私が使用しているライブラリのドキュメントの欠点だと考えていましたが、今ではこれが標準的な慣行であると感じ始めており、Ruby プログラマーとは考え方が少し異なります。私が知らない慣習はありますか?

開発者はこれにどのように対処しますか?

(そして、はい、私はライブラリ メソッドのコードを見て、どの例外が発生するかについてある程度のアイデアを得ることができましたが、100% 確信することはできず、文書化されていない場合、それに依存することに不快感を覚えます。)

EDIT : 最初の 2 つの回答を見た後、上記の JSON 解析の例を続けます。

私はすべきではないと思います:

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

コード/テストを見て、ParserErroron エラーが発生しているように見えるからです (nil を返すことは、Ruby では標準的な方法ではないようです)。推奨される方法は次のとおりです。

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

ParserError...コードとテストを調べて学んだことに基づいていますか?

(また、解析しているサーバーからの応答であることを明確にするために例を編集しました。)

4

5 に答える 5

9

(そして、はい、私はライブラリ メソッドのコードを見て、どの例外が発生するかについてある程度のアイデアを得ることができましたが、100% 確信することはできず、文書化されていない場合、それに依存することに不快感を覚えます。)

「可能性の高い」シナリオのいくつかと、何が発生する可能性があるかを示すため、テストを確認することをお勧めします。優れたテストはドキュメントでもあることを忘れないでください。

于 2009-09-08T07:30:06.743 に答える
4

無効な JSON データを破棄したい場合:

begin
  res = JSON.parse(string)
rescue JSON::ParserError => e
  # string was not valid
end
于 2015-08-25T12:43:18.310 に答える
3

ドキュメントが提供されていない場合は、次のようなものに頼る必要があると思います。

begin
   # code goes here
rescue
   # fail reason is in $!
end
于 2009-09-08T08:31:03.763 に答える
1

ライブラリコードがすべてをキャッチしてからラップしない限り、どの例外が発生するかを確認することはできません。最善の策は、入ってくるものをサニタイズしてコードからの適切な入力を想定し、独自のより高いレベルの例外処理を使用して、入力からの悪い入力をキャッチすることです。

于 2009-09-08T07:18:45.787 に答える