Skip to content

Commit d5fbe82

Browse files
authored
only break if error would propagate to user (#115)
1 parent bf14122 commit d5fbe82

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

src/interpret.jl

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -489,9 +489,21 @@ end
489489

490490
function handle_err(stack, frame, pc, err)
491491
if break_on_error[]
492-
frame.pc[] = pc
493-
push!(stack, frame)
494-
return BreakpointRef(frame.code, pc, err)
492+
# See if the current frame or a frame in the stack will catch this exception,
493+
# otherwise this exception would have been thrown to the user and we should
494+
# return a breakpoint
495+
exception_caught = false
496+
for fr in Iterators.flatten(((frame,), (Iterators.reverse(stack))))
497+
if !isempty(fr.exception_frames)
498+
exception_caught = true
499+
break
500+
end
501+
end
502+
if !exception_caught
503+
frame.pc[] = pc
504+
push!(stack, frame)
505+
return BreakpointRef(frame.code, pc, err)
506+
end
495507
end
496508
# Check for world age errors, which generally indicate a failure to go back to toplevel
497509
if isa(err, MethodError)

test/breakpoints.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,22 @@ end
102102
@test length(stack) >= 2
103103
@test stack[1].code.scope.name == :outer
104104
@test stack[2].code.scope.name == :inner
105+
106+
# Don't break on caught exceptions
107+
function f_exc_outer()
108+
try
109+
f_exc_inner()
110+
catch err
111+
return err
112+
end
113+
end
114+
function f_exc_inner()
115+
error()
116+
end
117+
stack = JuliaStackFrame[];
118+
frame = JuliaInterpreter.enter_call(f_exc_outer);
119+
v = JuliaInterpreter.finish_and_return!(stack, frame)
120+
@test v isa ErrorException
105121
finally
106122
JuliaInterpreter.break_on_error[] = false
107123
end

0 commit comments

Comments
 (0)