50555


ensure は、対応する `begin ~ end`
のブロックを抜ける際に、たとえ例外が発生していたとしても、必ずその句の内容を実行させるようにするための記法です。

ふと、例外でブロックを抜ける際に実行される ensure の最中に、例外が発生してしまった場合に、何が起こるのか気になりました。

### 質問

  * 例外発生時の ensure 句実行中の最中に、また別の例外がそこで発生した場合、 ruby はどのような挙動を示しますか？


CC BY-SA 4.0
2018-11-23T03:11:59.673
50554
2018-11-23T03:11:59.673
754
question
ruby
ensure の最中に例外が発生すると何がおきますか？


ensure に限らず、 ruby において例外発生中に別の例外を raise した場合、その新しい例外に対して古い例外を cause
に設定した状態で、新しい方の例外が送出されます。

具体例として:

[code]

    def raise_ex
      raise 'foo'
    rescue
      raise 'bar'
    ensure
      raise 'piyo'
    end
    
    begin
      raise_ex
    rescue StandardError => ex
      p ex
      p ex.cause
      p ex.cause.cause
      p ex.cause.cause.cause
    end
    
    ### 出力
    # #<RuntimeError: piyo>
    # #<RuntimeError: bar>
    # #<RuntimeError: foo>
    # nil
    
[/code]

### 環境

  * 2.5.1


CC BY-SA 4.0
2018-11-23T03:11:59.673
50555
2018-11-23T03:11:59.673
754
50554
answer