开发者

Ruby equivalent to PHPs set_error_handler

I have just barely gotten into Ruby / ROR but need to quickly write a class for handling errors and doing something with them. I've been able to find the important examples/tutorials for the rest of what I need but I'm having trouble finding what the best alternative to PHP's "set_error_handler" is.

My goals are:

  • I'd 开发者_如何学编程like to write a class that will capture any ruby-level errors automatically.
  • I'd like for the class to also be called by the user when there are custom errors/exceptions to report.

I'd like this work for any ruby app, but my main focus is for ruby-on-rails applications as well. Thanks for your advice.


I think the closest equivalent in Rails is rescue_from - it allows you to specify code will catch any given exception (except some template errors - though there are ways round that). If you want, you could then hand it off to some other class. So I guess what you'd do in your case would be:

in app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base
  rescue_from Exception do |e|
    MyExceptionHandler.handle_exception(e)
  end
end

in lib/my_exception_handler.rb:

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

If that helps, let me know and I'll dig out the link to how you catch template errors.


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


Define ApplicationController#rescue_in_public(exception) and put your custom handling code there.

This augments Rails' default exception handling at the top level - right before the HTTP response is generated. As your Rails apps grow in complexity and use external resources, there will be more exceptions that you'll want to handle much closer to where the exceptions are thrown, but this can get you started.

This method will only work on HTTP requests and will not catch exceptions in any custom rake tasks you create or code executed via rails runner.

Here's an example from one of my applications:

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜