Какая разница при использовании обеспечения и после спасения?

  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 ответа

Решение

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 блок не спасен. Это более актуально, когда есть также блок обеспечения, так как код будет выполняться перед ним.

Другие вопросы по тегам