1
  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
    
4

2 回答 2

2

1.

即使抛出异常,从方法返回,使用ensure,也会始终执行。baz_processfoo_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
于 2013-08-02T06:17:28.160 回答
0

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

对于问题2,区别在于elseblock中的代码抛出的异常没有被抢救。当还有一个确保块时,这更相关,因为代码将在它之前运行。

于 2013-08-02T06:26:29.657 回答