你能问ruby把警告视为错误吗?

时间:2009-03-19 01:14:37

标签: ruby warnings heckle

ruby​​是否允许您将警告视为错误?

我想这样做的一个原因是确保如果heckle删除一行代码意味着发出警告,我可以选择确保突变体被杀死。

3 个答案:

答案 0 :(得分:29)

遗憾的是,没有真正的方法可以做到这一点,至少在大多数版本的Ruby上都没有(变种可能存在),缺乏监控程序输出和在标准错误上出现警告时中止它。原因如下:

  • Ruby定义Kernel.warn,您可以重新定义以执行您想要的任何操作(包括退出),以及您期望 em>(希望)被Ruby一致地用来报告警告(包括内部例如解析警告),但是
  • 本地实现的方法(在C中)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即可。否则,您有两个选项

  1. 改变Kernel.warn退出source/error.crb_warn(和rb_warning?),然后重建Ruby
  2. 监控程序的“rb_warn_m”标准错误输出,并在匹配时将其中止

答案 1 :(得分:1)

你也可以使用DTrace,并拦截对rb_warnrb_warning的调用,虽然这不会产生可以从某个地方拯救的异常。相反,它只是将它们放在可以轻松记录它们的位置。

答案 2 :(得分:0)

您最终可以像这样覆盖Warning.warn来做到这一点

module Warning
  def warn(msg)
    raise msg
  end
end

这会将警告变为异常。此解决方案至少从2.4分支开始有效。