我正在编写一个简单的应用程序来处理POST
ed CSV 文件并针对无效输入(例如非 CSV 文件)对其进行测试。我正在使用 CSV::Reader.parse 命令在控制器方法中解析 CSV,如下所示:
@parsed_file = CSV::Reader.parse(params[:file]) rescue []
CSV::IllegalFormatError
然而,尽管有救援声明,当输入不正确的提交时,我仍然没有被抓住。我在这里想念什么?
谢谢!
我正在编写一个简单的应用程序来处理POST
ed CSV 文件并针对无效输入(例如非 CSV 文件)对其进行测试。我正在使用 CSV::Reader.parse 命令在控制器方法中解析 CSV,如下所示:
@parsed_file = CSV::Reader.parse(params[:file]) rescue []
CSV::IllegalFormatError
然而,尽管有救援声明,当输入不正确的提交时,我仍然没有被抓住。我在这里想念什么?
谢谢!
我最终不得不对 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
,它在原始文件中不存在。绝对是一个丑陋的黑客,但它会满足我的目的。
如果有人能解释为什么异常没有在控制器中被捕获,我很乐意为他们提供正确答案的分数。
You need to pass a file handle to parse:
@parsed_file = CSV::Reader.parse(File.open(params[:file], 'rb')) rescue []
听起来好像您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
显式使用都应该有效,并且比猴子补丁更干净。