Permalink
Browse files

Allow Dispatcher exceptions to be handled in application.rb using res…

…cue_from
  • Loading branch information...
lifo committed Jul 16, 2008
1 parent c64d749 commit 90c930f45c5c6766306929241462ffff8f67b86e
Showing with 25 additions and 12 deletions.
  1. +16 −12 actionpack/lib/action_controller/rescue.rb
  2. +9 −0 actionpack/test/controller/rescue_test.rb
@@ -112,19 +112,23 @@ def rescue_from(*klasses, &block)
protected
# Exception handler called when the performance of an action raises an exception.
def rescue_action(exception)
- log_error(exception) if logger
- erase_results if performed?
+ if handler_for_rescue(exception)
+ rescue_action_with_handler(exception)
+ else
+ log_error(exception) if logger
+ erase_results if performed?
- # Let the exception alter the response if it wants.
- # For example, MethodNotAllowed sets the Allow header.
- if exception.respond_to?(:handle_response!)
- exception.handle_response!(response)
- end
+ # Let the exception alter the response if it wants.
+ # For example, MethodNotAllowed sets the Allow header.
+ if exception.respond_to?(:handle_response!)
+ exception.handle_response!(response)
+ end
- if consider_all_requests_local || local_request?
- rescue_action_locally(exception)
- else
- rescue_action_in_public(exception)
+ if consider_all_requests_local || local_request?
+ rescue_action_locally(exception)
+ else
+ rescue_action_in_public(exception)
+ end
end
end
@@ -200,7 +204,7 @@ def rescue_action_with_handler(exception)
def perform_action_with_rescue #:nodoc:
perform_action_without_rescue
rescue Exception => exception
- rescue_action_with_handler(exception) || rescue_action(exception)
+ rescue_action(exception)
end
def rescues_path(template_name)
@@ -62,6 +62,11 @@ class ResourceUnavailableToRescueAsString < StandardError
render :text => exception.message
end
+ # This is a Dispatcher exception and should be in ApplicationController.
+ rescue_from ActionController::RoutingError do
+ render :text => 'no way'
+ end
+
def raises
render :text => 'already rendered'
raise "don't panic!"
@@ -378,6 +383,10 @@ def test_block_rescue_handler_with_argument_as_string
assert_equal "RescueController::ResourceUnavailableToRescueAsString", @response.body
end
+ def test_rescue_dispatcher_exceptions
+ RescueController.process_with_exception(@request, @response, ActionController::RoutingError.new("Route not found"))
+ assert_equal "no way", @response.body
+ end
protected
def with_all_requests_local(local = true)

1 comment on commit 90c930f

@jweissman

This comment has been minimized.

Show comment Hide comment
@jweissman

jweissman Sep 24, 2009

Sick.

Sick.

Please sign in to comment.