18

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

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

4

3 回答 3

34

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

  • Ruby 定义Kernel.warn,您可以重新定义它以做任何您想做的事情(包括退出),并且您希望(希望)Ruby 始终使用它来报告警告(包括内部例如解析警告),但是
  • 在 Ruby 中本机(在 C 中)实现的方法将依次直接调用一个名为rb_warnfrom的本机方法source/server.c,完全绕过您的重新定义Kernel.warn(例如string literal in condition,当执行类似的操作时发出的“”警告:do_something if 'string',通过本机rb_warnfrom打印source/parse.c
  • 更糟糕的是,还有一个额外的本地方法,如果指定或指定rb_warning,Ruby 可以使用该方法记录警告。-w-v

因此,如果您只需要对应用程序代码调用生成的警告采取措施,Kernel.warn那么只需重新定义Kernel.warn. 否则,您有两个选择

  1. 改变source/error.c退出rb_warnrb_warning(和rb_warn_m?),并重建Ruby
  2. 监视程序的“ : warning:”标准错误输出,并在匹配时中止它
于 2009-03-19T14:32:37.573 回答
7

你终于可以通过覆盖Warning.warn喜欢来做到这一点

module Warning
  def warn(msg)
    raise msg
  end
end

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

于 2019-06-08T00:55:42.177 回答
1

您也可以潜在地使用 DTrace,并拦截对 and 的调用rb_warnrb_warning尽管这不会产生您可以从某个地方拯救的异常。相反,它只会将它们放在您可以轻松记录它们的地方。

于 2009-04-14T18:46:43.977 回答