Ответ 1
Иногда мы просто хотим знать, что произошла ошибка, без необходимости обрабатывать ее.
Часто бывает так, что ответственным за обработку ошибок является пользователь объекта: вызывающая сторона. Что, если мы заинтересованы в ошибке, но не хотим брать на себя эту ответственность? Мы спасаем ошибку, делаем все, что нам нужно, а затем распространяем сигнал вверх по стеку, как будто ничего не произошло.
Например, что если мы захотим записать сообщение об ошибке, а затем разрешить вызывающей стороне разобраться с ним?
begin
this_will_fail!
rescue Failure => error
log.error error.message
raise
end
Вызов raise
без каких-либо аргументов вызовет последнюю ошибку. В нашем случае мы ре-рейзим error
.
В примере, который вы представили в своем вопросе, повторное поднятие ошибки просто не нужно. Вы можете просто позволить ему распространяться вверх по стеку естественным путем. Единственное отличие в вашем примере состоит в том, что вы создаете новый объект ошибки и поднимаете его вместо повторного вызова последнего.