Спасение не спасет в Rails
Я пишу простое приложение, которое обрабатывает POST
редактировал CSV-файлы и проверяю его на предмет некорректного ввода (например, не-CSV-файлов). Я использую команду CSV::Reader.parse для анализа CSV в методе контроллера следующим образом:
@parsed_file = CSV::Reader.parse(params[:file]) rescue []
Однако, несмотря на заявление о спасении, я все еще не пойман CSV::IllegalFormatError
когда неправильные представления введены. Что мне здесь не хватает?
Спасибо!
3 ответа
Я закончил тем, что мне пришлось пропатчить класс 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
, которого нет в оригинале. Определенно уродливый хак, но он послужит моим целям.
Если кто-нибудь может объяснить, почему исключение не было обнаружено в контроллере, я с удовольствием дам им баллы за правильный ответ.
Вам нужно передать дескриптор файла для разбора:
@parsed_file = CSV::Reader.parse(File.open(params[:file], 'rb')) rescue []
Звучит так, как будто ваш 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
явно должно работать, и будет чище, чем обезьяна патч.