Обработка исключения в рубине на рельсах

Я вызвал метод @txt.watch внутри модели из worker и внутри watch() находится массив parameters(parameters = self.parameters). Каждый параметр имеет уникальный ссылочный идентификатор. Я хочу спасти каждую ошибку исключения для каждого параметра внутри рабочего.

 class TextWorker
    def perform(id)
      @txt = WriteTxt.find(id)
      begin
        @txt.watch
        total_complete_watch = if @txt.job_type == 'movie'
                                @txt.total_count
                              else
                                @txt.tracks.where(status:'complete').size
                              end
        @txt.completed = total_completed_games
        @txt.complete = (total_complete_games == @txt.total_count)
        @txt.completed_at = Time.zone.now if @txt.complete
        @txt.zipper if @txt.complete
        @txt.save
        FileUtils.rm_rf @txt.base_dir if @txt.complete
      rescue StandardError => e
        #How to find errors for each reference_id here
      raise e
      end
    end
  end

Есть какой-нибудь способ сделать. Большое спасибо.

Исключения поднимаются одно за другим, они не собираются.

Зелёный 26.10.2018 08:51

Если @txt.watch на любом этапе выдает ошибку, ваш код перейдет к вызову строки rescue StandardError => e. Можете поделиться методом watch? Возможно, лучше сделать это там.

Stuart 26.10.2018 10:32

def watch txt = '' self.parameters.each do | параметр | txt + = movie_list (параметр) end write_list (txt) end

Bablu Patel 28.10.2018 06:27
0
3
53
1

Ответы 1

Я предполагаю, что self.parameters находится в вашем экземпляре класса Model. В этом случае сделайте следующее, и вы можете ссылаться на них.

begin
  @txt.watch
rescue StandardError
  p @parameters  # => self.parameters in the Model context
  raise
end

Примечание:

Как правило, рекомендуется ограничивать объем спасательных операций как можно более узким. Не включайте утверждения, которые не должны вызывать исключения в вашем основном предложении (например, @txt.save и FileUtils.rm_rf в вашем случае). Кроме того, гораздо лучше ограничить класс исключения; например, восстановить Encoding::CompatibilityError вместо EncodingError или EncodingError, установленный из StandardError, и так далее. Или еще лучший способ - определить свой собственный класс Exception и сознательно поднять его.

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