lib/polyphony/extensions/exception.rb in polyphony-0.79 vs lib/polyphony/extensions/exception.rb in polyphony-0.80
- old
+ new
@@ -1,45 +1,75 @@
# frozen_string_literal: true
-# Exeption overrides
+# Extensions to the Exception class
class ::Exception
class << self
+
+ # Set to true to disable sanitizing the backtrace (to remove frames occuring
+ # in the Polyphony code itself.)
attr_accessor :__disable_sanitized_backtrace__
end
- attr_accessor :source_fiber, :raising_fiber
+ # Set to the fiber in which the exception was *originally* raised (in case the
+ # exception was not caught.) The exception will propagate up the fiber tree,
+ # allowing it to be caught in any of the fiber's ancestors, while the
+ # `@source_fiber`` attribute will continue pointing to the original fiber.
+ attr_accessor :source_fiber
+ # Set to the fiber from which the exception was raised.
+ attr_accessor :raising_fiber
+
alias_method :orig_initialize, :initialize
+
+ # Initializes the exception with the given arguments.
def initialize(*args)
@raising_fiber = Fiber.current
orig_initialize(*args)
end
alias_method :orig_backtrace, :backtrace
+
+ # Returns the backtrace for the exception. If
+ # `Exception.__disable_sanitized_backtrace__` is not true, any stack frames
+ # occuring in Polyphony's code will be removed from the backtrace.
+ #
+ # @return [Array<String>] backtrace
def backtrace
unless @backtrace_called
@backtrace_called = true
return orig_backtrace
end
sanitized_backtrace
end
+ # Raises the exception. this method is a simple wrapper to `Kernel.raise`. It
+ # is overriden in the `Polyphony::Interjection` exception class.
+ def invoke
+ Kernel.raise(self)
+ end
+
+ private
+
+ # Returns a sanitized backtrace for the exception.
+ #
+ # @return [Array<String>] sanitized backtrace
def sanitized_backtrace
return sanitize(orig_backtrace) unless @raising_fiber
backtrace = orig_backtrace || []
sanitize(backtrace + @raising_fiber.caller)
end
POLYPHONY_DIR = File.expand_path(File.join(__dir__, '..'))
+ # Sanitizes the backtrace by removing any frames occuring in Polyphony's code
+ # base.
+ #
+ # @param backtrace [Array<String>] unsanitized backtrace
+ # @return [Array<String>] sanitized backtrace
def sanitize(backtrace)
return backtrace if ::Exception.__disable_sanitized_backtrace__
backtrace.reject { |l| l[POLYPHONY_DIR] }
- end
-
- def invoke
- Kernel.raise(self)
end
end