Ререйз (такое же исключение) после исключения в Ruby исключения

Я пытаюсь улучшить свои навыки Ruby, перехватывая исключения. Я хочу знать, является ли распространенным ререйз такого же исключения, когда у вас есть несколько вызовов методов. Итак, имеет ли смысл следующий код? Можно ли ререйзировать одно и то же исключение, или я не должен его поймать на методе процесса?

class Logo
  def process
    begin
      @processed_logo = LogoProcessor::create_image(self.src)
    rescue CustomException
      raise CustomException
    end
  end
end

module LogoProcessor
  def self.create_image
    raise CustomException if some_condition
  end
end

Ответы

Ответ 1

Иногда мы просто хотим знать, что произошла ошибка, без необходимости обрабатывать ее.

Часто бывает так, что ответственным за обработку ошибок является пользователь объекта: вызывающая сторона. Что, если мы заинтересованы в ошибке, но не хотим брать на себя эту ответственность? Мы спасаем ошибку, делаем все, что нам нужно, а затем распространяем сигнал вверх по стеку, как будто ничего не произошло.

Например, что если мы захотим записать сообщение об ошибке, а затем разрешить вызывающей стороне разобраться с ним?

begin
  this_will_fail!
rescue Failure => error
  log.error error.message
  raise
end

Вызов raise без каких-либо аргументов вызовет последнюю ошибку. В нашем случае мы ре-рейзим error.

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

Ответ 2

Это вызовет тот же тип ошибки, что и оригинал, но вы можете настроить сообщение.

rescue StandardError => e
  raise e.class, "Message: #{e.message}"

Ответ 3

Не совсем, вопрос, который вам нужно задать себе, где вам нужна эта информация? В вашем случае я бы поймал его локально и вернул false (отметив, что вызов завершился неудачно).