您能让ruby将警告视为错误吗?

您能让ruby将警告视为错误吗?,ruby,warnings,heckle,Ruby,Warnings,Heckle,ruby允许您将警告视为错误吗 我想这样做的一个原因是为了确保如果heckle删除一行代码意味着出现警告,我可以选择确保突变体被杀死。不幸的是,没有真正的方法做到这一点,至少在大多数版本的Ruby上没有(可能存在变体),没有监控程序输出并在标准错误上出现警告时中止程序输出。原因如下: Ruby定义,您可以重新定义它来做任何您想做的事情(包括退出),并且您希望Ruby一致地使用它来报告警告(包括内部警告,例如解析警告),但是 Ruby内部本机实现的方法(在C中)反过来将直接从source/ser

ruby允许您将警告视为错误吗


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

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

  • Ruby定义,您可以重新定义它来做任何您想做的事情(包括退出),并且您希望Ruby一致地使用它来报告警告(包括内部警告,例如解析警告),但是
  • Ruby内部本机实现的方法(在C中)反过来将直接从
    source/server.C
    调用名为
    rb\u warn
    的本机方法,完全绕过您对
    内核的重新定义。warn
    (例如,
    条件中的字符串文本
    )例如,在执行以下操作时发出的警告:
    do\u something if'string'
    ,通过
    source/parse.c
    中的本机
    rb\u warn
    打印)
  • 更糟糕的是,还有一个附加的,
    rb_warning
    原生方法,如果指定了
    -w
    -v
    ,Ruby可以使用该方法记录警告
因此,如果您只需要对应用程序代码调用
Kernel.warn
生成的警告执行操作,那么只需重新定义
Kernel.warn
。否则,您只有两个选项

  • 更改
    source/error.c
    退出
    rb\u warn
    rb\u warning
    (和
    rb\u warn\u m
    ?),然后重新生成Ruby
  • 监视程序的标准错误输出“
    :警告:
    ”,并在匹配时中止它

  • 您还可以潜在地使用DTrace,拦截对
    rb\u warn
    rb\u warning
    的调用,尽管这不会产生您可以从某处拯救的异常。相反,它只是将它们放在一个您可以轻松记录它们的地方。

    您最终可以通过覆盖
    Warning.warn
    这样做

    module Warning
      def warn(msg)
        raise msg
      end
    end
    

    这将使警告变成异常。此解决方案至少从2.4分支起就可以使用。

    谢谢。一个权威的答案,如果我曾经看到过的话!为“:warning:”监视程序的标准错误输出可能很有用。我提交了一个命令行标志的功能请求,以生成警告异常。。。医生What's RFE收到了一个回复,指出设置$DEBUG=true会导致“格式字符串的参数太多”从警告变为异常。@您的链接过期的医生。新链接: