СУХОЙ метод спасения для нескольких классов - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь сделать что-то, что мне кажется довольно простым, но я не могу найти способ сделать это СУХИМ.

Это код, который у меня был изначально:

мой первый рабочий

class WorkerOne < BaseWorker
  def perform
    # do stuff
  rescue *exceptions_to_rescue_with_error => error
    job_error(error, try_later: false)
  rescue *exceptions_to_rescue_with_error_and_try_later => error
    job_error(error, try_later: true)
  rescue *exceptions_to_rescue_with_warning => message
    job_warning(message, try_later: false)
  end
end

мой второй рабочий

class WorkerTwo < BaseWorker
  def perform
    # do stuff
  rescue *exceptions_to_rescue_with_error => error
    job_error(error, try_later: false)
  rescue *exceptions_to_rescue_with_error_and_try_later => error
    job_error(error, try_later: true)
  rescue *exceptions_to_rescue_with_warning => message
    job_warning(message, try_later: false)
  end
end

родительский класс

class BaseWorker
  def exceptions_to_rescue_with_error
    [
      Exceptions::SomeOtherError,
      ActiveRecord::RecordNotFound
    ]
  end

  def exceptions_to_rescue_with_error_and_try_later
    [
      Exceptions::SomeError1,
      Exceptions::SomeError2,
    ]
  end

  def exceptions_to_rescue_with_warning
    [
      Exceptions::SomeWarning
    ]
  end
end

Это метод, который я добавляю в BaseWorker, чтобы он работал:


  def self.with_job_rescue_for_perfom
    define_method(:perform) do |*args, &block|
      self.perform(*args, &block)
      rescue *exceptions_to_rescue_with_error => error
        job_error(error, try_later: false)
      rescue *exceptions_to_rescue_with_error_to_try_later => error
        job_error(error, try_later: true)
      rescue *exceptions_to_rescue_with_warning => message
        job_warning(message, try_later: false)
    end
  end
end

Я застрял там и не вижу, куда мне заглядывать дальше. Кажется, что используемый метод здесь не работает для меня, так как я не использую модуль.

Есть идеи?

1 Ответ

0 голосов
/ 09 марта 2019

Я бы сделал что-то подобное:

class BaseWorker
  def exceptions_to_rescue_with_error
    [
      Exceptions::SomeOtherError,
      ActiveRecord::RecordNotFound
    ]
  end

  def exceptions_to_rescue_with_error_and_try_later
    [
      Exceptions::SomeError1,
      Exceptions::SomeError2,
    ]
  end

  def exceptions_to_rescue_with_warning
    [
      Exceptions::SomeWarning
    ]
  end

  def perform
    do_stuff
  rescue *exceptions_to_rescue_with_error => error
    job_error(error, try_later: false)
  rescue *exceptions_to_rescue_with_error_and_try_later => error
    job_error(error, try_later: true)
  rescue *exceptions_to_rescue_with_warning => message
    job_warning(message, try_later: false)
  end
end

class WorkerOne < BaseWorker
  def do_stuff
    # do stuff
  end
end

class WorkerTwo < BaseWorker
  def do_stuff
    # do stuff
  end
end
...