К сожалению, нет никакого реального способа сделать это, по крайней мере, не на большинстве версий 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
. В противном случае у вас есть ровно два варианта :
- измените
source/error.c
для выхода в rb_warn
и rb_warning
(и rb_warn_m
?) И перестройте Ruby
- отслеживает стандартный вывод ошибок вашей программы для '
: warning:
' и прерывает его при совпадении