在哪里以及如何处理rails异常?

Nol*_*nDC 4 ruby exception-handling ruby-on-rails

我目前正在开发一个大型rails应用程序,它通过自定义API gem与另一个产品连接.这导致了一种非常奇怪的错误捕获.例如,当我们与其他产品交互时,它可能会返回我们期望的身份验证错误.然后我们在API gem中捕获该错误并抛出异常,然后在视图中捕获并转发给用户.

我不喜欢这种错误捕获方法,原因如下:

  • 似乎我们不应该期待异常并在我们的逻辑中使用它们.例如,有时我们想要覆盖一个对象 - 所以我们捕获"对象已存在"异常并继续保存我们的模型.
  • 它需要很多特定的错误捕获.代码中有多个区域,我们有if-elses检查某些错误并相应地重定向.

那就是说,我应该充实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
Run Code Online (Sandbox Code Playgroud)

最好的

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
Run Code Online (Sandbox Code Playgroud)

此外,如果第一个更好,我们如何处理可能在这些函数中抛出的实际API错误?我们将它们鼓泡到控制器中的rescue_from吗?

捕获和处理模型中的异常,或者将它们放入模型并在控制器中处理它们是否更好?

Dam*_*IEU 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
Run Code Online (Sandbox Code Playgroud)

每次引发ActiveRecord::RecordNotFound异常时,都会执行render_missing方法.
您可以将它与任何您想要的异常类一起使用.并且您不再需要在控制器中进行任何开始/救援.

当然,模型中引发的任何异常也可能被rescue_from捕获.

  • 我知道rescue_from.我想我要问的一个更相关的问题是:使用异常来控制我的应用程序是不好的做法(如果是,为什么?)?我应该尽可能避免例外吗? (2认同)
  • 有些人认为抛出它们会使代码更容易管理.向下抛出一个错误,并把它赶上去.只要你确保事情得到正确清理. (2认同)