Спасение не спасет в Rails - PullRequest
0 голосов
/ 01 июля 2011

Я пишу простое приложение, которое обрабатывает POST ed CSV-файлы и проверяю его на недопустимый ввод (например, не-CSV-файлы). Я использую команду CSV :: Reader.parse для анализа CSV в методе контроллера следующим образом:

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

Однако, несмотря на заявление о спасении, я все еще получаю необнаруженное CSV::IllegalFormatError при вводе неправильных представлений. Что мне здесь не хватает?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 05 июля 2011

Я закончил тем, что мне пришлось пропатчить класс 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, которого нет в оригинале. Определенно уродливый хак, но он послужит моим целям.

Если кто-нибудь может объяснить, почему исключение не было поймано в контроллере, я с удовольствием дам им баллы за правильный ответ.

0 голосов
/ 05 июля 2011

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

0 голосов
/ 01 июля 2011

Вам нужно передать дескриптор файла для разбора:

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