如何“忽略”抓住异常?

时间:2012-11-25 22:41:13

标签: ruby exception-handling

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

有时我可以看到“调度程序捕获异常:”这条消息抛出了我的一些功能。然后调度程序停止执行以下测试用例。

如何使调度程序运行所有测试用例而不管捕获的异常是什么?

2 个答案:

答案 0 :(得分:11)

这被称为“吞咽异常”。你拦截一个例外而不对它做任何事情。

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

答案 1 :(得分: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,而您可能需要挽救其他错误。