Feature #19572
closedAdd a new TracePoint event for rescued exceptions
Description
Summary
Support a new rescue
event type in TracePoint. When the event is triggered, TracePoint#rescued_exception
can be used to access the exception.
Reason
Currently, TracePoint supports raise
events, which can be helpful for debugging by showing which exception occurs at which location. By adding a rescue
event type, we can improve the developer's debugging experience by making it easier to check where an exception is rescued.
Currently, the most effective way to check where an exception is rescued involves setting a breakpoint at the exception's raised location and stepping through the code to see whether the debugger stops inside a rescue block. However, this can be a tedious process, especially in large applications with deep call stacks. By using a TracePoint event for rescue, developers can easily track exceptions as they are rescued by adding a few lines of code:
TracePoint.trace(:rescue) do |tp|
puts "Exception rescued: #{tp.rescued_exception} at #{tp.path}:#{tp.lineno}"
end
This new TracePoint event will also improve the ruby/debug
's ExceptionTracer
and provide users with a better debugging experience.
Updated by st0012 (Stan Lo) over 1 year ago
- Subject changed from Proposal: New TracePoint event for rescued exceptions to Add a new TracePoint event for rescued exceptions
Updated by Eregon (Benoit Daloze) over 1 year ago
Makes sense. FWIW TruffleRuby has a command-line option to print stacktraces of where exceptions are rescued, this would be a generalization of that.
Updated by ko1 (Koichi Sasada) over 1 year ago
Sorry for late response.
Two points:
- How should we handle C level rescue?
Some C code catch the exception. Should we trap it on this TracePoint?
rb_rescue()
is easy to implement this TP hook.
However some core feature handle it without rb_rescue()
, for example all exceptions are caught at the end of exception without rb_rescue()
.
For example only supports Ruby-level rescue
is one idea, but not sure it can satisfice the purpose.
- debugging experience
This new TracePoint event will also improve the ruby/debug's ExceptionTracer and provide users with a better debugging experience.
Could you explain more with examples?
Updated by st0012 (Stan Lo) over 1 year ago
We discussed this at the RubyKaigi dev-meeting as a topic and I also did a follow up discussion with @ko1 (Koichi Sasada). IIRC, the conclusion was:
- This
rescue
event is only for Ruby-level rescue. If there's a need for C-level rescue tracking, we may introduce ac_rescue
event, but I currently don't have a plan for it. - Instead of adding
TP#rescued_exception
, @ko1 (Koichi Sasada) suggested using theraised_exception
API for now. Considerrescue
will likely be used withraise
together, using the same API to access the exception can simplify implementation, so I agree with it. - There was no objection in introducing this event.
- @ko1 (Koichi Sasada) was ok with adopting it in
ruby/debug
'sExceptionTracer
.
@ko1 (Koichi Sasada) is there anything I missed or you may want to add?
Updated by ko1 (Koichi Sasada) over 1 year ago
- Status changed from Open to Closed
Applied in changeset git|d68c01fd314ebd6dc1d89c95a2734fad4f0953b0.
support rescue
event for TracePoint
fix [Feature #19572]
Updated by st0012 (Stan Lo) over 1 year ago
@ko1 (Koichi Sasada) Thank you!