Какая разница при использовании обеспечения и после спасения?
В чем разница между использованием
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
2 ответа
1.
С помощью 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, используя ensure
, baz_process
всегда будет выполняться, даже если исключение не перехвачено rescue
блок (т.е. в вашем примере кода, даже если исключение не является StandardError
). Он также будет запущен, если bar_process
выдвигает исключение Ни одна из этих вещей не верна для кода, размещенного после begin...rescue...ensure
блок.
Для вопроса 2 разница состоит в том, что исключения, генерируемые кодом в else
блок не спасен. Это более актуально, когда есть также блок обеспечения, так как код будет выполняться перед ним.