Javaや.NETをやってた人にしてみると、Exception
クラスは普通の例外の代表のように考えてしまうかもしれません。
しかしRubyのException
はNoMemoryError
等の致命的な例外の親クラスにもなっているため、例外の型を指定しないrescue
節では補足されません。
補足されるのは通常の実行時エラーを表すStandardError
とそのサブクラス(ArgumentError
等)になります。
require 'rspec'
describe 'rescue' do
shared_examples_for 'rescue StandardError' do
it 'should rescue StandardError' do
-> { subject.call(StandardError) }.should_not raise_error
end
end
context 'when not specify exception' do
subject do
->(e) {
begin
raise e
rescue
end
}
end
it 'should not rescue Exception' do
-> { subject.call(Exception) }.should raise_error(Exception)
end
it_should_behave_like 'rescue StandardError'
end
context 'when specify exception' do
subject do
->(e) {
begin
raise e
rescue Exception
end
}
end
it 'should rescue Exception' do
-> { subject.call(Exception) }.should_not raise_error
end
it_should_behave_like 'rescue StandardError'
end
end
$ rspec rescue_spec.rb
....
Finished in 0.00162 seconds
4 examples, 0 failures
Rubyの例外の階層関係についてはこちらのページの図がわかりやすいです。
例外クラスを自分で定義する場合も通常はException
クラスではなく、StandardError
クラスのサブクラスにすべき、ということになりますね。
###参考ページ