RubyにおいてException
クラスは各種例外クラスの親クラスになっているが、その派生クラスにはInterrupt
も含まれる。
そのため、rescue Exception
とした場合、ctrl
+c
でプログラムを停止しようとした場合にそのシグナルも捕捉されてしまい、プログラムが停止できなくなる。(そのような場合、kill -9
コマンドなどでプロセスを強制停止することになる)
危険なコード
bad_rescue.rb
begin
# なんらかの処理
rescue Exception
# 割り込みを含むすべての例外をキャッチしてしまう
end
改善したコード
better_code.rb
begin
# 何らかの処理
rescue
# StandardError およびそのサブクラスのみキャッチ
end
または
better_code.rb
begin
# 何らかの処理
rescue SomeException => e
# SomeException およびそのサブクラスのみキャッチ
end