Я пытаюсь улучшить свои навыки 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
begin @logo.process; rescue...
но тогда я бы не перехватил исключение, запущенное самим процессом, но чего-то, что было вызвано изнутри процесса. Это правильно?stacktrace
исходного исключения, вы, вероятно, захотите включить исключение,cause
которое доступно в ruby> 2.1raise
в манере этого ответа полностью сохраняет исходное исключение, включаяbacktrace
.cause
не относится к этому случаю. Напротив, он заполняется автоматически, когдаrescue
блок вызывает новое исключение.$!
глобальной переменной. Вызовraise
без аргументов вызывает ошибку, содержащуюся в$!
, фактически вызывая последнюю ошибку. Однакоraise error
вызовет ошибку, содержащуюся вerror
локальной переменной, которая может быть, а может и не быть тем же объектом, который содержится в$!
. В моем примере$!
это то же самое, что иerror
. Тем не менее, это также возможно:error = Exception.new; raise error
Это вызовет ошибку того же типа, что и исходное, но вы можете настроить сообщение.
rescue StandardError => e raise e.class, "Message: #{e.message}"
источник