And
And

Reputation: 1

rescue_from handlers inside two different modules

I try to create facade module, for module that do some generic exceptions handling, with additional logic.

For examle, first module:

module GenericErrorHandler
  extend ActiveSupport::Concern

  included do
    rescue_from Sequel::NoMatchingRow do |e|
      render json: {code: 404, error: e}
    end

    rescue_from StandardError do |e|
      render json: {code: 500, error: e}
    end
  end
end

And second module with logging:

module ErrorLogger
  extend ActiveSupport::Concern

  include GenericErrorHandler
  
  included do
    rescue_from StandardError do |e|
      puts "logged error #{e.to_s}"
      raise
    end
  end
end

When I include ErrorLogger in class that raises StandardException, only handler from ErrorLogger was called. But I expect, that handler from GenericErrorHandler must be called too because of raise in ErrorLogger handler. Is this possible to achieve such behavior? (looks like rescue_from from other module rewrites handlers after module inclusion)

Upvotes: 0

Views: 137

Answers (1)

Dmitry Barskov
Dmitry Barskov

Reputation: 1257

Do you consider using methods instead of blocks?

module GenericErrorHandler
  extend ActiveSupport::Concern

  def handle_standard_error(e)
    render json: {code: 500, error: e}
  end

  included do
    rescue_from Sequel::NoMatchingRow do |e|
      render json: {code: 404, error: e}
    end

    rescue_from StandardError, with: :handle_standard_error
  end
end

module ErrorLogger
  include GenericErrorHandler
  
  def handle_standard_error(e)
    puts "logged error #{e.to_s}"
    super
  end
end

Upvotes: 1

Related Questions