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
我有以下问题:
这可以通过使用:rescue_from(可以传入任何类型的选项)来完成吗?
如果没有,有没有更好的解决方案来处理这种情况?
(一种偏离主题但是)在一般的不同方法中处理相同类型的错误是不是一种坏习惯吗?
答案 0 :(得分:2)
Rails提供对controller and action names到controller_name
和action_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