Module: Tengine::Core::EventExceptionReportable

Extended by:
ActiveSupport::Concern
Included in:
Kernel
Defined in:
lib/tengine/core/event_exception_reportable.rb

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

FIRE_ALL =
lambda do |kernel, dsl_context, event, exception|
  kernel.fire("#{event.event_type_name}.error.tengined",
    :properties => {
      :original_event => event.to_json,
      :error_class_name => exception.class.name,
      :error_message => exception.message,
      :error_backtrace => exception.backtrace,
      # :block_source_location => '%s:%d' % block.source_location,
    })
end
FIRE_EXCEPT_TESTING_ERROR =
lambda do |kernel, dsl_context, event, exception|
  if exception.class.name =~ /^Test::|^MiniTest::|^RSpec::|^Spec::/
    raise exception
  else
    FIRE_ALL.call(kernel, dsl_context, event, exception)
  end
end
RAISE_ALL =
lambda do |kernel, dsl_context, event, exception|
  raise exception
end
EVENT_EXCEPTION_REPORTERS =
{
  :fire_all => FIRE_ALL,
  :raise_all => RAISE_ALL,
  :except_test => FIRE_EXCEPT_TESTING_ERROR,
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.to_reporter(reporter) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/tengine/core/event_exception_reportable.rb', line 36

def to_reporter(reporter)
  if reporter.is_a?(Symbol)
    result = EVENT_EXCEPTION_REPORTERS[reporter]
    raise NameError, "Unknown reporter: #{reporter.inspect}" unless result
    result
  elsif reporter.respond_to?(:call)
    reporter
  else
    raise ArgumentError, "Invalid reporter: #{reporter.inspect}"
  end
end

Instance Method Details

#report_on_exception(dsl_context, event) ⇒ Object



74
75
76
77
78
79
80
81
82
83
# File 'lib/tengine/core/event_exception_reportable.rb', line 74

def report_on_exception(dsl_context, event)
  begin
    yield
  rescue Exception => e
    Tengine.logger.error("[#{e.class.name}] #{e.message}\n  " << e.backtrace.join("\n  "))
    if reporter = Tengine::Core::Kernel.event_exception_reporter
      reporter.call(self, dsl_context, event, e)
    end
  end
end