Спасение не спасет в 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 явно должно работать, и будет чище, чем обезьяна патч.

Другие вопросы по тегам