<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,14 +1,26 @@
 module ActionDispatch
   class Rescue
-    def initialize(app, rescuer)
-      @app, @rescuer = app, rescuer
+    def initialize(app, rescuers = {}, &amp;block)
+      @app, @rescuers = app, {}
+      rescuers.each { |exception, rescuer| rescue_from(exception, rescuer) }
+      instance_eval(&amp;block) if block_given?
     end
 
     def call(env)
       @app.call(env)
     rescue Exception =&gt; exception
-      env['action_dispatch.rescue.exception'] = exception
-      @rescuer.call(env)
+      if rescuer = @rescuers[exception.class.name]
+        env['action_dispatch.rescue.exception'] = exception
+        rescuer.call(env)
+      else
+        raise exception
+      end
     end
+
+    protected
+      def rescue_from(exception, rescuer)
+        exception = exception.class.name if exception.is_a?(Exception)
+        @rescuers[exception.to_s] = rescuer
+      end
   end
 end</diff>
      <filename>actionpack/lib/action_dispatch/middleware/rescue.rb</filename>
    </modified>
    <modified>
      <diff>@@ -227,12 +227,6 @@ class ControllerInheritanceRescueControllerTest &lt; ActionController::TestCase
   end
 end
 
-class ApplicationController &lt; ActionController::Base
-  rescue_from ActionController::RoutingError do
-    render :text =&gt; 'no way'
-  end
-end
-
 class RescueControllerTest &lt; ActionController::TestCase
   def test_rescue_handler
     get :not_authorized
@@ -331,24 +325,21 @@ class RescueTest &lt; ActionController::IntegrationTest
     end
   end
 
-  # test 'rescue routing exceptions' do
-  #   assert_equal 1, ApplicationController.rescue_handlers.length
-  #
-  #   begin
-  #     with_test_routing do
-  #       get '/no_way'
-  #       assert_equal 'no way', response.body
-  #     end
-  #   ensure
-  #     ActionController::Base.rescue_handlers.clear
-  #   end
-  # end
+  test 'rescue routing exceptions' do
+    app = ActionDispatch::Rescue.new(ActionController::Routing::Routes) do
+      rescue_from ActionController::RoutingError, lambda { |env| [200, {&quot;Content-Type&quot; =&gt; &quot;text/html&quot;}, &quot;Gotcha!&quot;] }
+    end
+    @integration_session = open_session(app)
+
+    get '/b00m'
+    assert_equal &quot;Gotcha!&quot;, response.body
+  end
 
   test 'unrescued exception' do
-    with_test_routing do
-      get '/b00m'
-      assert_match(/Action Controller: Exception caught/, response.body)
-    end
+    app = ActionDispatch::Rescue.new(ActionController::Routing::Routes)
+    @integration_session = open_session(app)
+
+    assert_raise(ActionController::RoutingError) { get '/b00m' }
   end
 
   private</diff>
      <filename>actionpack/test/controller/rescue_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>90d7ae23c6f5a7e914d8b9fd74481ac61b6c4fb9</id>
    </parent>
  </parents>
  <author>
    <name>Joshua Peek</name>
    <login>josh</login>
    <email>josh@joshpeek.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/52aeb8d2e72223f9b40b0193c151c252a3f4fb09</url>
  <id>52aeb8d2e72223f9b40b0193c151c252a3f4fb09</id>
  <committed-date>2009-09-15T14:33:15-07:00</committed-date>
  <authored-date>2009-09-15T14:33:15-07:00</authored-date>
  <message>Beef up AD::Rescue to replace global exception handling lost in ApplicationController</message>
  <tree>96ac7e1b9f0beafbc0dc51cea4070789d3b9980f</tree>
  <committer>
    <name>Joshua Peek</name>
    <login>josh</login>
    <email>josh@joshpeek.com</email>
  </committer>
</commit>
