mirror of
https://github.com/pry/pry.git
synced 2022-11-09 12:35:05 -05:00
commands/wtf,pry: add support for Exception#cause
Fixes #1449 (support exceptions with cause) Replaces #1525
This commit is contained in:
parent
ef80932bc6
commit
30cca64e5a
3 changed files with 61 additions and 0 deletions
|
@ -46,6 +46,15 @@ class Pry
|
|||
else
|
||||
output.puts "#{exception.class}: #{exception.message}"
|
||||
output.puts "from #{exception.backtrace.first}"
|
||||
|
||||
if exception.respond_to? :cause
|
||||
cause = exception.cause
|
||||
while cause
|
||||
output.puts "Caused by #{cause.class}: #{cause}\n"
|
||||
output.puts "from #{cause.backtrace.first}"
|
||||
cause = cause.cause
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -32,6 +32,19 @@ class Pry
|
|||
else
|
||||
output.puts with_line_numbers(backtrace.first(size_of_backtrace))
|
||||
end
|
||||
|
||||
if exception.respond_to? :cause
|
||||
cause = exception.cause
|
||||
while cause
|
||||
output.puts "#{text.bold('Caused by:')} #{cause.class}: #{cause}\n--"
|
||||
if opts.verbose?
|
||||
output.puts with_line_numbers(cause.backtrace)
|
||||
else
|
||||
output.puts with_line_numbers(cause.backtrace.first(size_of_backtrace))
|
||||
end
|
||||
cause = cause.cause
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
|
39
spec/commands/wtf_spec.rb
Normal file
39
spec/commands/wtf_spec.rb
Normal file
|
@ -0,0 +1,39 @@
|
|||
require_relative '../helper'
|
||||
|
||||
describe "wtf?!" do
|
||||
let(:tester) do
|
||||
pry_tester do
|
||||
def last_exception=(ex)
|
||||
@pry.last_exception = ex
|
||||
end
|
||||
|
||||
def last_exception
|
||||
@pry.last_exception
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "unwinds nested exceptions" do
|
||||
if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new('2.0.0')
|
||||
skip('Exception#cause is not supported')
|
||||
end
|
||||
|
||||
begin
|
||||
begin
|
||||
begin
|
||||
raise 'inner'
|
||||
rescue RuntimeError
|
||||
raise 'outer'
|
||||
end
|
||||
end
|
||||
rescue RuntimeError => ex
|
||||
tester.last_exception = ex
|
||||
end
|
||||
|
||||
expect(tester.eval('wtf -v')).to match(/
|
||||
Exception:\sRuntimeError:\souter
|
||||
.+
|
||||
Caused\sby:\sRuntimeError:\sinner
|
||||
/xm)
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue