Как я добавляю информацию к сообщению об исключении, не изменяя его класс в рубине?
Подход, который я в настоящее время использую,
strings.each_with_index do |string, i|
begin
do_risky_operation(string)
rescue
raise $!.class, "Problem with string number #{i}: #{$!}"
end
end
Идеально, я также хотел бы сохранить след.
Существует ли лучший путь?
Мой подход заключался бы в расширении
] rescue
d ошибка с анонимным модулем, который расширяет метод сообщения об ошибке
:
def make_extended_message(msg)
Module.new do
@@msg = msg
def message
super + @@msg
end
end
end
begin
begin
raise "this is a test"
rescue
raise($!.extend(make_extended_message(" that has been extended")))
end
rescue
puts $! # just says "this is a test"
puts $!.message # says extended message
end
Таким образом, вы не сбрасываете никакую другую информацию в исключении (то есть его backtrace
).
Это не намного лучше, но вы можете просто повторно поднять исключение с новым сообщением:
raise $!, "Problem with string number #{i}: #{$!}"
Вы также можете получить измененный объект исключения самостоятельно с помощью метода exception
:
new_exception = $!.exception "Problem with string number #{i}: #{$!}"
raise new_exception