【问题标题】:Can you ask ruby to treat warnings as errors?你能要求 ruby​​ 将警告视为错误吗?
【发布时间】:2010-10-14 05:29:27
【问题描述】:

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

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

【问题讨论】:

标签: ruby warnings heckle


【解决方案1】:

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

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

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

  1. source/error.c 更改为退出rb_warnrb_warning(以及rb_warn_m?),然后重建Ruby
  2. 监视程序的“: warning:”标准错误输出,并在匹配时中止它

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    module Warning
      def warn(msg)
        raise msg
      end
    end
    

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

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 2012-01-13
      • 2022-08-03
      • 2011-06-12
      • 2010-11-05
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      相关资源
      最近更新 更多