aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch
diff options
context:
space:
mode:
authorRafael França <rafaelmfranca@gmail.com>2018-04-20 11:31:38 -0400
committerGitHub <noreply@github.com>2018-04-20 11:31:38 -0400
commit357559feea1e41afbe48f3c70215d9cd67f04021 (patch)
treee6f6c9fa647125e07321e1f26ee1c02393181dde /actionpack/lib/action_dispatch
parent00caf95e14b90782ab17fbd6d2b930844df99980 (diff)
parentd25fba89d49bf741de6d7dfa857afcc61468b815 (diff)
downloadrails-357559feea1e41afbe48f3c70215d9cd67f04021.tar.gz
rails-357559feea1e41afbe48f3c70215d9cd67f04021.tar.bz2
rails-357559feea1e41afbe48f3c70215d9cd67f04021.zip
Merge pull request #23868 from gsamokovarov/debug-exceptions-interceptors
Introduce ActionDispatch::DebugExceptions interceptors
Diffstat (limited to 'actionpack/lib/action_dispatch')
-rw-r--r--actionpack/lib/action_dispatch/middleware/debug_exceptions.rb24
1 files changed, 23 insertions, 1 deletions
diff --git a/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb b/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb
index 511306eb0e..33edad8bd9 100644
--- a/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb
+++ b/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb
@@ -50,10 +50,18 @@ module ActionDispatch
end
end
- def initialize(app, routes_app = nil, response_format = :default)
+ cattr_reader :interceptors, instance_accessor: false, default: []
+
+ def self.register_interceptor(object = nil, &block)
+ interceptor = object || block
+ interceptors << interceptor
+ end
+
+ def initialize(app, routes_app = nil, response_format = :default, interceptors = self.class.interceptors)
@app = app
@routes_app = routes_app
@response_format = response_format
+ @interceptors = interceptors
end
def call(env)
@@ -67,12 +75,26 @@ module ActionDispatch
response
rescue Exception => exception
+ invoke_interceptors(request, exception)
raise exception unless request.show_exceptions?
render_exception(request, exception)
end
private
+ def invoke_interceptors(request, exception)
+ backtrace_cleaner = request.get_header("action_dispatch.backtrace_cleaner")
+ wrapper = ExceptionWrapper.new(backtrace_cleaner, exception)
+
+ @interceptors.each do |interceptor|
+ begin
+ interceptor.call(request, exception)
+ rescue Exception
+ log_error(request, wrapper)
+ end
+ end
+ end
+
def render_exception(request, exception)
backtrace_cleaner = request.get_header("action_dispatch.backtrace_cleaner")
wrapper = ExceptionWrapper.new(backtrace_cleaner, exception)