0

我正在编写一个简单的应用程序来处理POSTed CSV 文件并针对无效输入(例如非 CSV 文件)对其进行测试。我正在使用 CSV::Reader.parse 命令在控制器方法中解析 CSV,如下所示:

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

CSV::IllegalFormatError然而,尽管有救援声明,当输入不正确的提交时,我仍然没有被抓住。我在这里想念什么?

谢谢!

4

3 回答 3

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

You need to pass a file handle to parse:

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

听起来好像您CSV::IllegalFormatError的子类化不正确RuntimeError。或者RuntimeError已更改为 not subclass 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 回答