summaryrefslogtreecommitdiff
path: root/lib/pry/exception_handler.rb
diff options
context:
space:
mode:
authorKyrylo Silin <silin@kyrylo.org>2019-04-14 19:14:16 +0300
committerKyrylo Silin <silin@kyrylo.org>2019-04-15 00:08:24 +0300
commit95d3a74e9b22c44ea48ce870171640f0471db09b (patch)
tree5dae8107c718d96c11a0340d7b3c55a550fab0d0 /lib/pry/exception_handler.rb
parent9306e69bda2f44985944cbc162db4723cb8a0ec4 (diff)
downloadpry-exception-handler-refactoring.tar.gz
config: factor out exception_handler hook to a separate classexception-handler-refactoring
Diffstat (limited to 'lib/pry/exception_handler.rb')
-rw-r--r--lib/pry/exception_handler.rb41
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/pry/exception_handler.rb b/lib/pry/exception_handler.rb
new file mode 100644
index 00000000..9b50fe80
--- /dev/null
+++ b/lib/pry/exception_handler.rb
@@ -0,0 +1,41 @@
+class Pry
+ # @api private
+ # @since ?.?.?
+ module ExceptionHandler
+ class << self
+ # Will only show the first line of the backtrace.
+ def handle_exception(output, exception, _pry_instance)
+ if exception.is_a?(UserError) && exception.is_a?(SyntaxError)
+ output.puts "SyntaxError: #{exception.message.sub(/.*syntax error, */m, '')}"
+ else
+ output.puts standard_error_text_for(exception)
+ end
+ end
+
+ private
+
+ def standard_error_text_for(exception)
+ text = exception_text(exception)
+ return text unless exception.respond_to?(:cause)
+
+ cause = exception.cause
+ while cause
+ text += cause_text(cause)
+ cause = cause.cause
+ end
+
+ text
+ end
+
+ def exception_text(exception)
+ "#{exception.class}: #{exception.message}\n" \
+ "from #{exception.backtrace.first}\n"
+ end
+
+ def cause_text(cause)
+ "Caused by #{cause.class}: #{cause}\n" \
+ "from #{cause.backtrace.first}\n"
+ end
+ end
+ end
+end