Можете ли вы попросить ruby ​​рассматривать предупреждения как ошибки? - PullRequest
15 голосов
/ 19 марта 2009

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

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

Ответы [ 3 ]

29 голосов
/ 19 марта 2009

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

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

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

  1. измените source/error.c для выхода в rb_warn и rb_warningrb_warn_m?) И перестройте Ruby
  2. отслеживает стандартный вывод ошибок вашей программы для ': warning:' и прерывает его при совпадении
1 голос
/ 14 апреля 2009

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

0 голосов
/ 08 июня 2019

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

module Warning
  def warn(msg)
    raise msg
  end
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...