Rescuable モジュールを含めると機能しないのはなぜですか?

概要

class MyKlass

  include ActiveSupport::Rescuable

  rescue_from Exception do
    return "rescued"
  end

  #other stuff
end

MyKlass は純粋な Ruby オブジェクトですが、Rails アプリケーション内で定義されています。

Rails コンソールで MyKlass インスタンスを呼び出して、確実に例外を発生させるメソッドを適用しようとすると、救済されると期待されるエラー以外は何も起こりません。

解決策

使用方法は次のとおりです。

class MyKlass
  include ActiveSupport::Rescuable
  # define a method, which will do something for you, when exception is caught
  rescue_from Exception, with: :my_rescue

  def some_method(&block)
    yield
  rescue Exception => exception
    rescue_with_handler(exception) || raise
  end

  # do whatever you want with exception, for example, write it to logs
  def my_rescue(exception)
    puts "Exception caught! #{exception.class}: #{exception.message}"
  end
end

MyKlass.new.some_method { 0 / 0 }
# Exception caught! ZeroDivisionError: divided by 0
#=> true

例外の救出は犯罪であることは言うまでもありません。