Как я добавляю информацию к сообщению об исключении в Ruby?

Как я добавляю информацию к сообщению об исключении, не изменяя его класс в рубине?

Подход, который я в настоящее время использую,

strings.each_with_index do |string, i|
  begin
    do_risky_operation(string)
  rescue
    raise $!.class, "Problem with string number #{i}: #{$!}"
  end
end

Идеально, я также хотел бы сохранить след.

Существует ли лучший путь?

55
задан Sim 31 August 2013 в 05:10
поделиться

2 ответа

Мой подход заключался бы в расширении ] 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 ).

4
ответ дан 7 November 2019 в 07:11
поделиться

Это не намного лучше, но вы можете просто повторно поднять исключение с новым сообщением:

raise $!, "Problem with string number #{i}: #{$!}"

Вы также можете получить измененный объект исключения самостоятельно с помощью метода exception:

new_exception = $!.exception "Problem with string number #{i}: #{$!}"
raise new_exception
17
ответ дан 7 November 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: