【问题标题】:How to "ignore" caught exceptions?如何“忽略”捕获的异常?
【发布时间】:2012-11-13 10:14:36
【问题描述】:

我使用rufus scheduler 通过调用我的函数来运行夜间测试脚本。

有时我会看到“调度程序捕获异常:”这条消息引发了我的一些函数。然后调度程序停止执行以下测试用例。

我怎样才能让调度程序运行所有测试用例而不管捕获到任何异常?

【问题讨论】:

    标签: ruby exception-handling


    【解决方案1】:

    这称为“异常吞咽”。你拦截了一个异常并且不做任何事情。

    begin
      # do some dangerous stuff, like running test scripts
    rescue => ex
      # do nothing here, except for logging, maybe
    end
    

    如果你不需要对异常做任何事情,你可以省略=> ex

    begin
      # do some dangerous stuff, like running test scripts
    rescue; end
    

    如果你需要拯救Exceptions that don't subclass from StandardError,你需要更明确:

    begin
      # do some dangerous stuff, like running test scripts
    rescue Exception
      # catches EVERY exception
    end
    

    【讨论】:

    • 不错!我没有看到rescue-without-class 语法。
    【解决方案2】:

    我有时会使用这样一个事实,即您可以将块传递给方法,并且我有方法救援错误,并且我的代码可以继续执行。

    def check_block                                
      yield                                        
    rescue NoMethodError => e                      
       <<-EOR
         Error raised with message "#{e}".        
         Backtrace would be #{e.backtrace.join('')}
       EOR
    end    
    
    puts check_block {"some string".sort.inspect}
    puts check_block {['some', 'array'].sort.inspect}
    

    第一个块将通过救援并返回报告,第二个将正常运行。

    此救援仅救援NoMethodError,而您可能需要救援其他错误。

    【讨论】:

    • 嘿,问个简单的问题,我对 Ruby 还很陌生,从未见过
    • 当然。它是 HereDoc 语法。它基本上让我可以使用字符串中的引号而无需转义它们。在这种情况下,这可能暗示字符串插值需要双引号。它不是。 HereDoc 已经是双引号字符串语法。破折号表示我可以让终止符从 0 列缩进。 EOR 分隔符是任意的。可以是任何东西。
    • 有了你的解释,再加上维基百科和乱七八糟的东西,我现在明白了。非常感谢!
    • 在这个answer 中,我展示了如何直接在 HereDoc 上使用方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 2011-07-06
    • 2012-08-11
    • 2012-04-11
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多