Rubyのbegin…rescueで暗黙的に捕捉されないエラー

RubyではKernel#exitを実行すると、SystemExitというエラーが発生して終了する。Rubyのrescue
節は=>evarの形式でエラーオブジェクトを取得できるので、begin..rescue..endで挟んでみる。

begin
  puts 'start'
  exit
rescue => err
  puts "end: #{err}"
end

しかし上記のようなコードでは、start とのみ出力される。これはRubyのリファレンスマニュアルにも記載されている以下のような仕様による挙動。

error_type が省略された時は StandardError のサブクラスであ る全ての例外を捕捉します。Rubyの組み込み例外は(SystemExit や Interrupt のような脱出を目的としたものを除いて) StandardError のサブクラスです。

したがって、SystemExitを捕捉する場合は以下のように書く必要がある。

begin
  puts 'start'
  exit
rescue SystemExit => err
  puts "end: #{err}"
end

逆に言えば、この仕様があるおかげでbegin…rescue…endの中でexitを呼び出しても何ら問題なく期待通りの挙動となる。

Pocket
LINEで送る
LinkedIn にシェア