Skip to content

Commit 28af3b3

Browse files
authored
only break if we are throwing an uncaught exception (#89)
1 parent 9c5fd8f commit 28af3b3

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

src/interpret.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,11 @@ function step_expr!(stack, frame, istoplevel::Bool=false)
486486
end
487487

488488
function handle_err(stack, frame, pc, err)
489+
if !isempty(frame.exception_frames)
490+
# Exception caught
491+
frame.last_exception[] = err
492+
return JuliaProgramCounter(frame.exception_frames[end])
493+
end
489494
if break_on_error[]
490495
frame.pc[] = pc
491496
push!(stack, frame)
@@ -499,12 +504,9 @@ function handle_err(stack, frame, pc, err)
499504
hasmethod(err.f, arg_types) &&
500505
!hasmethod(err.f, arg_types, world = err.world))
501506
@warn "likely failure to return to toplevel, try JuliaInterpreter.split_expressions"
502-
rethrow(err)
503507
end
504508
end
505-
isempty(frame.exception_frames) && rethrow(err)
506-
frame.last_exception[] = err
507-
return JuliaProgramCounter(frame.exception_frames[end])
509+
rethrow(err)
508510
end
509511

510512
"""

test/breakpoints.jl

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,23 @@ end
8484
remove()
8585

8686
# break on error
87-
inner(x) = error("oops")
88-
outer() = inner(1)
89-
JuliaInterpreter.break_on_error[] = true
90-
stack = JuliaStackFrame[]
91-
frame = JuliaInterpreter.enter_call(outer)
92-
bp = JuliaInterpreter.finish_and_return!(stack, frame)
93-
@test bp.err == ErrorException("oops")
94-
@test length(stack) >= 2
95-
@test stack[1].code.scope.name == :outer
96-
@test stack[2].code.scope.name == :inner
87+
try
88+
JuliaInterpreter.break_on_error[] = true
89+
90+
inner(x) = error("oops")
91+
outer() = inner(1)
92+
stack = JuliaStackFrame[]
93+
frame = JuliaInterpreter.enter_call(outer)
94+
bp = JuliaInterpreter.finish_and_return!(stack, frame)
95+
@test bp.err == ErrorException("oops")
96+
@test length(stack) >= 2
97+
@test stack[1].code.scope.name == :outer
98+
@test stack[2].code.scope.name == :inner
99+
100+
f_catch() = try error(); catch; return 2; end
101+
@test @interpret f_catch() == 2
102+
103+
finally
104+
JuliaInterpreter.break_on_error[] = false
105+
end
97106
end

0 commit comments

Comments
 (0)