Class: ActionDispatch::ExceptionWrapper

Inherits:
Object
  • Object
show all
Defined in:
lib/action_dispatch/middleware/exception_wrapper.rb

Defined Under Namespace

Classes: SourceMapLocation

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(backtrace_cleaner, exception) ⇒ ExceptionWrapper

Returns a new instance of ExceptionWrapper.



51
52
53
54
55
56
57
58
59
60
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 51

def initialize(backtrace_cleaner, exception)
  @backtrace_cleaner = backtrace_cleaner
  @exception_class_name = exception.class.name
  @wrapped_causes = wrapped_causes_for(exception, backtrace_cleaner)
  @exception = exception
  if exception.is_a?(SyntaxError)
    @exception = ActiveSupport::SyntaxErrorProxy.new(exception)
  end
  @backtrace = build_backtrace
end

Instance Attribute Details

#backtrace_cleanerObject (readonly)

Returns the value of attribute backtrace_cleaner.



49
50
51
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 49

def backtrace_cleaner
  @backtrace_cleaner
end

#exceptionObject (readonly)

Returns the value of attribute exception.



49
50
51
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 49

def exception
  @exception
end

#exception_class_nameObject (readonly)

Returns the value of attribute exception_class_name.



49
50
51
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 49

def exception_class_name
  @exception_class_name
end

#wrapped_causesObject (readonly)

Returns the value of attribute wrapped_causes.



49
50
51
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 49

def wrapped_causes
  @wrapped_causes
end

Class Method Details

.status_code_for_exception(class_name) ⇒ Object



181
182
183
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 181

def self.status_code_for_exception(class_name)
  ActionDispatch::Response.rack_status_code(@@rescue_responses[class_name])
end

Instance Method Details

#actionsObject



102
103
104
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 102

def actions
  ActiveSupport::ActionableError.actions(@exception)
end

#annotated_source_codeObject



114
115
116
117
118
119
120
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 114

def annotated_source_code
  if exception.respond_to?(:annotated_source_code)
    exception.annotated_source_code
  else
    []
  end
end

#application_traceObject



136
137
138
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 136

def application_trace
  clean_backtrace(:silent)
end

#correctionsObject



90
91
92
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 90

def corrections
  @exception.corrections
end

#exception_idObject



234
235
236
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 234

def exception_id
  exception.object_id
end

#exception_inspectObject



230
231
232
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 230

def exception_inspect
  exception.inspect
end

#exception_nameObject



222
223
224
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 222

def exception_name
  exception.cause.class.to_s
end

#exception_traceObject



130
131
132
133
134
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 130

def exception_trace
  trace = application_trace
  trace = framework_trace if trace.empty? && !silent_exceptions.include?(@exception_class_name)
  trace
end

#failuresObject



78
79
80
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 78

def failures
  @exception.failures
end

#file_nameObject



94
95
96
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 94

def file_name
  @exception.file_name
end

#framework_traceObject



140
141
142
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 140

def framework_trace
  clean_backtrace(:noise)
end

#full_traceObject



144
145
146
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 144

def full_trace
  clean_backtrace(:all)
end

#has_cause?Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 74

def has_cause?
  @exception.cause
end

#has_corrections?Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 82

def has_corrections?
  @exception.respond_to?(:original_message) && @exception.respond_to?(:corrections)
end

#line_numberObject



98
99
100
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 98

def line_number
  @exception.line_number
end

#messageObject



226
227
228
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 226

def message
  exception.message
end

#original_messageObject



86
87
88
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 86

def original_message
  @exception.original_message
end

#rescue_response?Boolean

Returns:

  • (Boolean)


200
201
202
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 200

def rescue_response?
  @@rescue_responses.key?(exception.class.name)
end

#rescue_templateObject



122
123
124
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 122

def rescue_template
  @@rescue_templates[@exception_class_name]
end

#routing_error?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 62

def routing_error?
  @exception.is_a?(ActionController::RoutingError)
end

#show?(request) ⇒ Boolean

Returns:

  • (Boolean)


185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 185

def show?(request)
  # We're treating `nil` as "unset", and we want the default setting to be `:all`.
  # This logic should be extracted to `env_config` and calculated once.
  config = request.get_header("action_dispatch.show_exceptions")

  case config
  when :none
    false
  when :rescuable
    rescue_response?
  else
    true
  end
end

#source_extractsObject



204
205
206
207
208
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 204

def source_extracts
  backtrace.map do |trace|
    extract_source(trace).merge(trace: trace)
  end
end

#source_to_show_idObject



218
219
220
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 218

def source_to_show_id
  (traces[trace_to_show].first || {})[:id]
end

#status_codeObject



126
127
128
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 126

def status_code
  self.class.status_code_for_exception(unwrapped_exception.class.name)
end

#sub_template_messageObject



70
71
72
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 70

def sub_template_message
  @exception.sub_template_message
end

#template_error?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 66

def template_error?
  @exception.is_a?(ActionView::Template::Error)
end

#trace_to_showObject



210
211
212
213
214
215
216
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 210

def trace_to_show
  if traces["Application Trace"].empty? && rescue_template != "routing_error"
    "Full Trace"
  else
    "Application Trace"
  end
end

#tracesObject



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 148

def traces
  application_trace_with_ids = []
  framework_trace_with_ids = []
  full_trace_with_ids = []
  application_traces = application_trace.map(&:to_s)

  full_trace = backtrace_cleaner&.clean_locations(backtrace, :all).presence || backtrace
  full_trace.each_with_index do |trace, idx|
    filtered_trace = backtrace_cleaner&.clean_frame(trace, :all) || trace

    trace_with_id = {
      exception_object_id: @exception.object_id,
      id: idx,
      trace: trace,
      filtered_trace: filtered_trace,
    }

    if application_traces.include?(filtered_trace.to_s)
      application_trace_with_ids << trace_with_id
    else
      framework_trace_with_ids << trace_with_id
    end

    full_trace_with_ids << trace_with_id
  end

  {
    "Application Trace" => application_trace_with_ids,
    "Framework Trace" => framework_trace_with_ids,
    "Full Trace" => full_trace_with_ids
  }
end

#unwrapped_exceptionObject



106
107
108
109
110
111
112
# File 'lib/action_dispatch/middleware/exception_wrapper.rb', line 106

def unwrapped_exception
  if wrapper_exceptions.include?(@exception_class_name)
    @exception.cause
  else
    @exception
  end
end