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