まず第一に、本当にサブクラス化すべきではありませんException
。これは、、、、を含むすべてのRuby 例外のスーパークラスです。これらはすべて、通常はレスキューする必要はありません。誤ってまたは故意にそうするのはお勧めできません。ユーザーによって中断された場合でも、プログラムが正常に終了するのを妨げる可能性があるためです。また、非常にあいまいなバグを隠したり、生成したりすることもあります。NoMemoryError
SyntaxError
Interrupt
SystemExit
サブクラス化したいのはStandardError
、日常のプログラミングで見られるほとんどの Ruby エラーのスーパークラスです。このクラスは、指定しないと d になるクラスでもありrescue
ます。
begin
object.do_something!
rescue => error # will rescue StandardError and all subclasses
$stderr.puts error.message
end
これがあなたが探している「デフォルトの動作」だと思います。特定のエラーを処理してから、他のすべてのエラーを一般的に処理できます。
class CustomApplicationError < StandardError
end
begin
object.do_something!
rescue CustomApplicationError => error
recover_from error
rescue => error
log.error error.message
raise
end
このelse
句は、エラー処理において無意味ではありません。ensure
関係なくコードを実行する句とは対照的に、例外が発生しなかった場合にのみ、ネストされたコードを実行します。これにより、成功事例を処理できます。
begin
object.do_something!
rescue => error
log.error error.message
else
log.info 'Everything went smoothly'
end