ruby是否允许您将警告视为错误?
我想这样做的一个原因是确保如果heckle删除一行代码意味着发出警告,我可以选择确保突变体被杀死。
答案 0 :(得分:29)
遗憾的是,没有真正的方法可以做到这一点,至少在大多数版本的Ruby上都没有(变种可能存在),缺乏监控程序输出和在标准错误上出现警告时中止它。原因如下:
Kernel.warn
,您可以重新定义以执行您想要的任何操作(包括退出),以及您期望> em>(希望)被Ruby一致地用来报告警告(包括内部例如解析警告),但是 rb_warn
直接调用名为source/server.c
的本机方法,完全绕过重新定义{{ 1}} (例如,“Kernel.warn
”警告,例如,在执行类似string literal in condition
之类的操作时发出的警告,是通过do_something if 'string'
中的原始rb_warn
打印的)source/parse.c
本机方法,如果指定了rb_warning
或-w
,Ruby可以使用该方法记录警告。因此,如果您需要仅对应用程序代码调用-v
生成的警告采取措施,那么只需重新定义Kernel.warn
即可。否则,您有两个选项:
Kernel.warn
退出source/error.c
和rb_warn
(和rb_warning
?),然后重建Ruby rb_warn_m
”标准错误输出,并在匹配时将其中止答案 1 :(得分:1)
你也可以使用DTrace,并拦截对rb_warn
和rb_warning
的调用,虽然这不会产生可以从某个地方拯救的异常。相反,它只是将它们放在可以轻松记录它们的位置。
答案 2 :(得分:0)
您最终可以像这样覆盖Warning.warn
来做到这一点
module Warning
def warn(msg)
raise msg
end
end
这会将警告变为异常。此解决方案至少从2.4分支开始有效。