Ruby相当于PHP的set_error_handler

时间:2011-05-19 20:56:48

标签: ruby-on-rails ruby

我刚刚进入Ruby / ROR但需要快速编写一个类来处理错误并使用它们做些什么。我已经能够找到我需要的其余部分的重要示例/教程但是我很难找到PHP的“set_error_handler”的最佳替代方案。

我的目标是:

  • 我想写一个能自动捕获任何红宝石级错误的类。
  • 当有自定义错误/例外报告时,我希望用户也可以调用该类。

我喜欢这个适用于任何ruby应用程序的工作,但我主要关注ruby-on-rails应用程序。谢谢你的建议。

3 个答案:

答案 0 :(得分:0)

begin
  #require all_kinds_of_things
  "abc".size(1,2)
  123.reverse
  # rest of brilliant app
rescue Exception => e #Custom, catch-all exeption handler
  puts "Doh...#{e}"
  print "Do you want the backtrace? (Y) :"
  puts e.backtrace if gets.chomp == "Y"
end

答案 1 :(得分:0)

定义ApplicationController#rescue_in_public(exception)并将自定义处理代码放在那里。

这增强了Rails在顶层的默认异常处理 - 就在生成HTTP响应之前。随着您的Rails应用程序的复杂性增加并使用外部资源,您将需要处理更多异常,以便更接近抛出异常的位置,但这可以帮助您入门。

此方法仅适用于HTTP请求,并且不会捕获您创建的任何自定义rake任务或通过rails runner执行的代码中的异常。

以下是我的一个应用程序的示例:

class ApplicationController < ActionController::Base
  ...
  protected

  def rescue_action_in_public (exception)
    case exception
    when ActionController::InvalidAuthenticityToken
      if request.xhr?
        render :update do |page|
          page.redirect_to '/sessions/new/'
        end
      else
        redirect_to '/sessions/new/'
      end
    when ActionController::NotImplemented
      RAILS_DEFAULT_LOGGER.info("ActionController::NotImplemented\n#{request.inspect}")
      render :nothing => true, :status => '500 Error'
    else
      super
    end
  end
end

答案 2 :(得分:0)

我认为Rails中最接近的等价物是rescue_from - 它允许你指定代码将捕获任何给定的异常(除了一些模板错误 - 尽管有一些方法)。如果你愿意,你可以把它交给其他一些班级。所以我猜你在你的案子中会做的是:

app / controllers / application_controller.rb中的

class ApplicationController < ActionController::Base
  rescue_from Exception do |e|
    MyExceptionHandler.handle_exception(e)
  end
end
lib / my_exception_handler.rb中的

class MyExceptionHandler
  def self.handle_exception exception
    # your code goes here
  end
end

如果有帮助,请告诉我,我会挖掘出如何捕获模板错误的链接。