summaryrefslogtreecommitdiff
path: root/lib/pry/exception_handler.rb
diff options
context:
space:
mode:
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