Rails - rescue_from异常根据引发异常的方法处理异常类型

时间:2015-05-28 15:36:52

标签: ruby-on-rails ruby ruby-on-rails-4 exception-handling

Rails的:rescue_from接受特定的异常类型和方法作为参数如下:

class ApplicationController < ActionController::Base
  rescue_from User::NotAuthorized, with: :deny_access # self defined exception
  rescue_from ActiveRecord::RecordInvalid, with: :show_errors

  rescue_from 'MyAppError::Base' do |exception|
    render xml: exception, status: 500
  end

  protected
    def deny_access
      ...
    end

    def show_errors(exception)
      exception.record.new_record? ? ...
    end
end

但这意味着它将以与控制器中的所有ACROSS相同的方式处理指定的异常。

如果我想根据引发异常的方法来处理异常类型,例如:

,该怎么办?
class MyController < ActionController::Base

  def method_1
    # Do Something
  rescue MyCustomError => e
    handle_exception_for_method_1(e)
  end

  def method_2
    # Do Something
  rescue MyCustomError => e
    handle_exception_for_method2(e)
  end

protected

  def handle_exception_for_method_1(exception)
    # Do Something
  end

  def handle_exception_for_method_2(exception)
    # Do Something
  end

end

我有以下问题:

  1. 这可以通过使用:rescue_from(可以传入任何类型的选项)来完成吗?

  2. 如果没有,有没有更好的解决方案来处理这种情况?

  3. (一种偏离主题但是)在一般的不同方法中处理相同类型的错误是不是一种坏习惯吗?

1 个答案:

答案 0 :(得分:2)

Rails提供对controller and action namescontroller_nameaction_name方法的访问权限。您可以使用它来根据引发异常的方法以不同方式处理异常。

示例:

class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordInvalid, with: :show_errors

  protected

    def show_errors
      if action_name == "create"
        ...
      elsif action_name == ...
        ...
    end
end