【问题标题】:Exceptions in Ruby on RailsRuby on Rails 中的异常
【发布时间】:2013-12-19 12:22:32
【问题描述】:

我的应用中的简单 index 操作

 def index
  @reports = CustomReport.all
 end

当应用程序准备好时,我被告知添加exceptions,我从其他application 复制它,因为我不知道,

def index
    begin
      @reports = CustomReport.all
    rescue Exception => e
      Rails.logger.info "Exception in design_custom_reports controller, index action"
      Rails.logger.info e
      flash[:notice] = "Sorry, something went wrong. Please inform administration"
      redirect_to :controller => :user, :action => :dashboard
    end
end

现在看起来很笨拙是不是?

处理RoR中场景的最佳方式?

【问题讨论】:

  • 看不懂这个异常处理器的思路,你想干什么?
  • 我真的没有道理。您在从数据库请求所有记录时尝试捕获错误?通常应用程序会在遇到此救援之前停止工作
  • 这只是一个旁注,但通常接受的风格不是 def...begin...rescue...end,而是 def...rescue...end。

标签: ruby-on-rails ruby exception


【解决方案1】:

简答

那个救援条款真的没有意义。删除它。

长答案

这是一个非常糟糕的代码。首先,问题是:谁告诉你要“添加例外”,出于什么目的?

代码

CustomReport.all

仅在非常特殊的情况下才会引发异常。一般来说,当应用程序无法连接到数据库时。事实上,不存在可能导致代码自然失败的外部用户输入或条件。

相反,此代码可能会更频繁地失败

CustomReport.find(params[:id])

因为如果找不到对象,find 会引发错误,这绝对是更常见的情况。

如果您的方法因数据库错误而崩溃,则很可能整个应用程序都会受到影响,因此救援管理可能在您的全局应用程序中有意义,而不是在该方法中。拯救它的方法不多。

最后但并非最不重要的一点是,抢救 Exception 类的异常

rescue Exception => e

在 Ruby 中被认为是一种代码异味。事实上,你应该只拯救 StandardErrors 或更大的错误。如果你拯救了一个Exception 类,你必须非常清楚它的含义。系统级错误和语法错误继承自 Exception,因此如果您挽救 Exception,您可能会在代码中隐藏很多潜在错误。

但同样,即使拯救StandardError 也没有多大意义。其实我们之前说过CustomReport.all只有在数据库连接错误的情况下才会失败。这意味着,如果您真的想挽救某些东西,您应该只挽救那里的数据库故障。

【讨论】:

  • 最后的工作是,在你提到的情况下,你写的异常管理没有意义。每当您编写代码时,您都应该进行相应的单元/功能/集成测试。如果您为自己编写的代码编写测试,您自己会注意到您编写它的方式没有多大意义。
【解决方案2】:

您可以将该代码放在应用程序控制器中。它将捕获整个应用程序中的所有错误。而且您不需要在任何其他控制器中编写更多内容,因为它们已经被应用程序控制器继承了

rescue_from Exception  do |exception|
  @error = exception
  exception_logger
end

private

def exception_logger
 Rails.logger.error "Exception in design_custom_reports controller, index action"
 Rails.logger.error @error
 flash[:notice] = "Sorry, something went wrong. Please inform administration"
 redirect_to :controller => :user, :action => :dashboard
end

【讨论】:

  • 这是一个非常糟糕的例子。永远不要挽救 Exception 类型的异常(这是一种常见的 Java 做法,在 Ruby 中被视为错误代码),尤其是在 Rails 等复杂应用程序中。
  • @SimoneCarletti 我知道,但我只是尝试根据问题给出解决方案:(
  • 我明白了。但是,考虑到用户的专业水平,我认为提供一个不会鼓励他遵循不良做法的解决方案会更有效。 ;)
  • @SimoneCarletti 我会在以后的回答中记住这一点。谢谢你的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多