Подтвердить что ты не робот

Можете ли вы попросить рубин обработать предупреждения как ошибки?

Позволяет ли ruby ​​обрабатывать предупреждения как ошибки?

Одна из причин, по которой я хотел бы сделать это, - убедиться, что если удаление строки строки из кода означает, что возникает предупреждение, у меня есть возможность убедиться, что мутант убит.

4b9b3361

Ответ 1

К сожалению, нет реального способа сделать это, по крайней мере, не для большинства версий Ruby (возможны варианты), недостаточно для контроля выхода программы и прерывания ее, когда появляется предупреждение стандартная ошибка. Вот почему:

  • Ruby определяет Kernel.warn, который вы можете переопределить, чтобы делать все, что пожелаете (включая выход), и которые вы ожидаете (надеюсь), которые будут последовательно использоваться Ruby для предупреждения о предупреждениях (включая внутреннее, например, предупреждение синтаксического анализа), но
  • методы, реализованные изначально (в C) внутри Ruby, будут в свою очередь напрямую вызывать собственный метод с именем rb_warn из source/server.c, полностью в обход вашего переопределения Kernel.warn (например, предупреждение "string literal in condition", например, выдается при выполнении чего-то вроде: do_something if 'string', печатается через нативный rb_warn from source/parse.c)
  • чтобы сделать вещи еще хуже, есть дополнительный, rb_warning собственный метод, который может использоваться Ruby для регистрации предупреждений, если указан -w или -v.

Итак, если вам нужно действовать только на предупреждениях, генерируемых кодом вашего приложения, вызывающего Kernel.warn, тогда просто переопределить Kernel.warn. В противном случае у вас есть ровно два параметра:

  • alter source/error.c, чтобы выйти в rb_warn и rb_warningrb_warn_m?) и перестроить Ruby
  • отслеживать стандартный вывод ошибки программы для ': warning:' и прервать его при совпадении

Ответ 2

Вы также можете использовать DTrace и перехватить вызовы на rb_warn и rb_warning, хотя это не приведет к созданию исключений, которые вы можете спасти где-то. Скорее всего, они просто помещают их где-нибудь, вы можете легко их зарегистрировать.

Ответ 3

Наконец, вы можете сделать это, переопределив Warning.warn как

module Warning
  def warn(msg)
    raise msg
  end
end

Это превратит предупреждение в исключение. Это решение работает как минимум с 2.4 ветки.