Search code examples
rubyrescue

What is the difference when using ensure and else after rescue?


  1. What is the difference between using ensure:

    begin
      foo_process
    rescue
      bar_process
    ensure
      baz_process
    end
    

    and putting the process after the begin ... rescue ... end block?

    begin
      foo_process
    rescue
      bar_process
    end
    baz_process
    
  2. What is the difference between using else:

    begin
      foo_process
    rescue
      bar_process
    else
      baz_process
    end
    

    and continuing that process before rescue (supposing that baz_process does not raise an error)?

    begin
      foo_process
      baz_process
    rescue
      bar_process
    end
    

Solution

  • 1.

    Using ensure, baz_process is alway executed even though foo_process throw exception, return from method.

    For example,

    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