0

POSTed CSVファイルを処理し、無効な入力(CSV以外のファイルなど)に対してテストする簡単なアプリを作成しています。次のように、CSV::Reader.parseコマンドを使用してコントローラーメソッドでCSVを解析しています。

@parsed_file = CSV::Reader.parse(params[:file]) rescue []

CSV::IllegalFormatErrorしかし、レスキューステートメントにもかかわらず、不適切な提出物が入力されたとき、私はまだ捕まえられていません。ここで何が欠けていますか?

ありがとう!

4

3 に答える 3

0

解析するには、ファイルハンドルを渡す必要があります。

@parsed_file = CSV::Reader.parse(File.open(params[:file], 'rb')) rescue []
于 2011-07-01T19:30:02.730 に答える
0

例外を適切に処理するには、CSV::Readerクラスにモンキーパッチを適用する必要がありました。なぜコントローラーに捕らえられなかったのかはまだわかりませんが、最終的に作成したコードは次のとおりです。

class CSV
  class Reader
    def each
      while true
        row = []
        parsed_cells = get_row(row) rescue 0 
        if parsed_cells == 0
          break
        end
        yield(row)
      end
      nil
    end
  end
end

オリジナルには存在しない、rescue 0への呼び出しの後のことに注意してください。get_row間違いなく醜いハックですが、それは私の目的に役立ちます。

例外がコントローラーに捕らえられなかった理由を誰かが説明できるなら、私は彼らに正解を持っていることのポイントを喜んで与えます。

于 2011-07-05T14:36:30.513 に答える
0

CSV::IllegalFormatError正しくサブクラス化されていないように聞こえますRuntimeError。またはRuntimeError、サブクラスではないように変更されましたStandardError

StandardErrorサブクラスがデフォルトのレスキューブロックでキャッチされるエラーのみ。この理論をテストするには、

@parsed_file = begin 
  CSV::Reader.parse(params[:file]) 
rescue StandardError
  puts "I caught a StandardError"
  []
rescue Exception => e
  puts "I caught #{e.class}->#{e.class.superclass}->#{e.class.superclass.superclass}"
  []
end

これは、私(そしておそらく他の人)がこの問題を繰り返すことができない理由を説明します。

明示的に使用する場合はどのような場合でもException機能するはずであり、モンキーパッチよりもクリーンになります。

于 2011-07-05T17:40:26.350 に答える