Rails 3: Flexible exception handling

Because all good things need to be duplicated ...

originally posted @plataformatec.com
by José Valim

When Rails 3.0 came out, one of the features that people suddenly missed was the ability to better handle exceptions. The issue was: since Rails 3 became a lot more Rack fluent, we had to move some features to the middleware stack and this forced us to move the whole exceptions handling as well.

Rails 3.2 attempts to bring some customization back to the game by allowing you to set your own exceptions rack application that is invoked when a failure happens. For instance, you could set the exceptions application to your own router in your config/application.rb:

config.exceptions_app = self.routes

Now, every time there is an exception, your router is going to be invoked. Therefore, to render custom 404 pages, you could simply add to your router:

match "/404", :to => "errors#not_found"

And implement the logic in the controller as you wish! However, there are a few things to keep in mind if you go down this road:

Remember that whatever you do in the errors controller, it should not be anything “fancy”. Keep it simple because something already went wrong with your application!

Don't forget the controller

In this example I am using the following

errors_controller.rb

Inside that, I will have the following:

class ErrorsController < ApplicationController
  def render_404
  end

  def render_500
  end
end