1

例外のデフォルトの動作を実装するにはどうすればよいですか? begin rescue else機能しません(私はそうすべきだと思います)。

elseで、シナリオ的に無意味じゃない?例外が発生しないときに実行する必要があるコードは、begin-rescueブロック間で実行されます。

ちなみに、次の回避策がありますが、満足していません。

class MyException < Exception
end

class YourException < Exception
end

begin
  raise MyException if 2 > 50
  raise YourException if 1 < 90
rescue Exception => e
  case e.message
  when /MyException/
    puts "MyException Caught"
  else
    puts "Default Exception Caught"
  end
end
4

2 に答える 2

5

まず第一に、本当にサブクラス化すべきではありませんException。これは、、、、を含むすべてのRuby 例外のスーパークラスです。これらはすべて、通常はレスキューする必要はありません。誤ってまたは故意にそうするのはお勧めできません。ユーザーによって中断された場合でも、プログラムが正常に終了するのを妨げる可能性があるためです。また、非常にあいまいなバグを隠したり、生成したりすることもあります。NoMemoryErrorSyntaxErrorInterruptSystemExit

サブクラス化したいのは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
于 2013-07-06T13:46:06.327 に答える