使用ensure
:
begin
foo_process
rescue
bar_process
ensure
baz_process
end
并将流程置于begin
... rescue
... end
块之后?
begin
foo_process
rescue
bar_process
end
baz_process
使用else
:
begin
foo_process
rescue
bar_process
else
baz_process
end
并在rescue
之前继续该过程(假设baz_process
没有引发错误)?
begin
foo_process
baz_process
rescue
bar_process
end
答案 0 :(得分:2)
使用ensure
,baz_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,使用ensure
,baz_process
将始终运行,即使rescue
块未捕获到异常(即在示例代码中,即使异常不是StandardError
)。如果bar_process
引发异常,也会运行它。对于放置在begin...rescue...ensure
块之后的代码,这些都不适用。
对于问题2,区别在于else
块中的代码抛出的异常不会被挽救。当存在确保块时,这更相关,因为代码将在它之前运行。