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を呼び出しても何ら問題なく期待通りの挙動となる。