ruby 是否允许您将警告视为错误?
我想这样做的一个原因是确保如果删除一行代码意味着发生警告,我可以选择确保突变体被杀死。
不幸的是,没有真正的方法可以做到这一点,至少在大多数版本的 Ruby 上没有(可能存在变化),没有监控程序输出并在标准错误出现警告时中止它。原因如下:
Kernel.warn
,您可以重新定义它以做任何您想做的事情(包括退出),并且您希望(希望)Ruby 始终使用它来报告警告(包括内部例如解析警告),但是rb_warn
from的本机方法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
. 否则,您有两个选择:
source/error.c
退出rb_warn
和rb_warning
(和rb_warn_m
?),并重建Ruby: warning:
”标准错误输出,并在匹配时中止它你终于可以通过覆盖Warning.warn
喜欢来做到这一点
module Warning
def warn(msg)
raise msg
end
end
这会将警告变成异常。该解决方案至少从 2.4 分支开始有效。
您也可以潜在地使用 DTrace,并拦截对 and 的调用rb_warn
,rb_warning
尽管这不会产生您可以从某个地方拯救的异常。相反,它只会将它们放在您可以轻松记录它们的地方。