我目前正在开发一个大型rails应用程序,它通过自定义API gem与另一个产品连接。这导致了一种非常奇怪的错误捕获。例如,当我们与其他产品交互时,它可能会返回我们期望的身份验证错误。然后我们在API gem中捕获该错误并抛出异常,然后在视图中捕获并转发给用户。
由于以下几个原因,我不喜欢这种错误捕获方法:
那就是说,我应该充实API gem以使更简单的函数不会抛出异常吗?是
if user.has_permission_in_product?
if object.doesnt_exist_in_product?
do something
else
redirect somewhere with errors
end
else
redirect somewhere else with errors
end
优先
begin
do something
rescue APIError => e
if e.message =~ "no permission"
redirect somewhere with errors
elsif e.message =~ "already exists"
redirect somewhere else with errors
end
end
此外,如果第一个更好,我们如何处理可能在这些函数中抛出的实际API错误?我们是否将它们冒充到控制器中的rescue_from中?
在模型中捕获和处理异常,或者将它们放入模型并在控制器中处理它们是否更好?
答案 0 :(得分:12)
您在寻找rescue_from吗?
在您的控制器中,执行以下操作:
class MyController < ApplicationController
rescue_from ActiveRecord::RecordNotFound, :with => :render_missing
def render_missing
render 'This is a 404', :status => 404
end
end
每次引发ActiveRecord::RecordNotFound
异常时,都会执行render_missing方法
您可以将它与任何您想要的异常类一起使用。并且您不再需要在控制器中进行任何开始/救援。
当然,模型中引发的任何异常也可能被rescue_from捕获。