救援不会在Rails中拯救

时间:2011-07-01 19:13:59

标签: ruby-on-rails exception csv user-input rescue

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

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

然而,尽管有救援声明,但在输入不正确的提交时,我仍然会收到未被发现的CSV::IllegalFormatError。我在这里缺少什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

您需要传递一个文件句柄来解析:

@parsed_file = CSV::Reader.parse(File.open(params[:file], 'rb')) rescue []

答案 1 :(得分: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,原件中不存在{{1}}。绝对是一个丑陋的黑客,但它将满足我的目的。

如果有人能解释为什么没有在控制器中捕获异常,我很乐意给他们积分以获得正确答案。

答案 2 :(得分:0)

听起来好像你的CSV::IllegalFormatError没有正确地继承RuntimeError。或者,RuntimeError已更改为不是子类StandardError

默认的救援块只捕获子类StandardError的错误。为了测试这个理论,试试<​​/ p>

@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的情况应该如何工作,并且比猴子补丁更清洁。