使用确保和救援后有什么区别?

时间:2013-08-02 06:10:14

标签: ruby rescue

  1. 使用ensure

    之间的区别
    begin
      foo_process
    rescue
      bar_process
    ensure
      baz_process
    end
    

    并将流程置于begin ... rescue ... end块之后?

    begin
      foo_process
    rescue
      bar_process
    end
    baz_process
    
  2. 使用else

    之间的区别
    begin
      foo_process
    rescue
      bar_process
    else
      baz_process
    end
    

    并在rescue之前继续该过程(假设baz_process没有引发错误)?

    begin
      foo_process
      baz_process
    rescue
      bar_process
    end
    

2 个答案:

答案 0 :(得分:2)

1

使用ensurebaz_process总是执行,即使foo_process抛出异常,从方法返回。

例如,

def foo_process
  puts 'foo_process'
  return 111
end

def f1
  begin
    return foo_process
  rescue 
    puts 'bar_process'
  ensure 
    puts 'baz_process'
  end
end

def f2
  begin
    return foo_process
  rescue 
    puts 'bar_process'
  end
  puts 'baz_process'
end

>> f1
foo_process
baz_process
=> 111
>> f2
foo_process
=> 111

答案 1 :(得分:0)

对于问题1,使用ensurebaz_process将始终运行,即使rescue块未捕获到异常(即在示例代码中,即使异常不是StandardError)。如果bar_process引发异常,也会运行它。对于放置在begin...rescue...ensure块之后的代码,这些都不适用。

对于问题2,区别在于else块中的代码抛出的异常不会被挽救。当存在确保块时,这更相关,因为代码将在它之前运行。