我正在撰写一个处理POST
个CSV文件的简单应用,并针对无效输入(例如非CSV文件)对其进行测试。我正在使用CSV :: Reader.parse命令在控制器方法中解析CSV,如下所示:
@parsed_file = CSV::Reader.parse(params[:file]) rescue []
然而,尽管有救援声明,但在输入不正确的提交时,我仍然会收到未被发现的CSV::IllegalFormatError
。我在这里缺少什么?
谢谢!
答案 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
的情况应该如何工作,并且比猴子补丁更清洁。