Project

General

Profile

Feature #8960

Add Exception#backtrace_locations

Added by Charles Nutter almost 3 years ago. Updated 7 days ago.

Status:
Feedback
Priority:
Normal
[ruby-core:57430]

Description

All parties agreed this would be useful to add in https://bugs.ruby-lang.org/issues/7895 and ko1 suggested I file a feature against ruby-trunk. So here it is.

I might be able to come up with a patch, but I'm not sure when. Help wanted.

Can we agree this will go into 2.1?


Related issues

Related to CommonRuby - Feature #7895: Exception#backtrace_locations to go with Thread#backtrace_locations and Kernel#caller_locations Open 02/21/2013

Associated revisions

Revision 44170
Added by Koichi Sasada over 2 years ago

  • error.c: add Exception#backtrace_locations. Now, there are no setter and independent from Exception#backtrace. [Feature #8960]
  • eval.c (setup_exception): set backtrace locations for `bt_location' special attribute.
  • vm_backtrace.c (rb_backtrace_to_location_ary): added.
  • internal.h: ditto.
  • test/ruby/test_backtrace.rb: add a test for Exception#backtrace_locations.

Revision 44170
Added by Koichi Sasada over 2 years ago

  • error.c: add Exception#backtrace_locations. Now, there are no setter and independent from Exception#backtrace. [Feature #8960]
  • eval.c (setup_exception): set backtrace locations for `bt_location' special attribute.
  • vm_backtrace.c (rb_backtrace_to_location_ary): added.
  • internal.h: ditto.
  • test/ruby/test_backtrace.rb: add a test for Exception#backtrace_locations.

Revision 44170
Added by Koichi Sasada over 2 years ago

  • error.c: add Exception#backtrace_locations. Now, there are no setter and independent from Exception#backtrace. [Feature #8960]
  • eval.c (setup_exception): set backtrace locations for `bt_location' special attribute.
  • vm_backtrace.c (rb_backtrace_to_location_ary): added.
  • internal.h: ditto.
  • test/ruby/test_backtrace.rb: add a test for Exception#backtrace_locations.

History

#1 [ruby-core:57470] Updated by Koichi Sasada almost 3 years ago

  • Assignee set to Koichi Sasada
  • Category set to core
  • Target version set to 2.1.0

I'll try before preview-2.

JRuby already has a implementation and tests?

#2 [ruby-core:57489] Updated by Charles Nutter almost 3 years ago

JRuby has implementation but no tests. The test should look pretty much like Thread#backtrace_locations tests, though.

I can work on some tests if you work on impl for MRI.

#3 [ruby-core:59082] Updated by Nobuyoshi Nakada over 2 years ago

What will be returned from an exception set by Exception#set_backtrace in JRuby?

#4 Updated by Koichi Sasada over 2 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r44170.
Charles, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • error.c: add Exception#backtrace_locations. Now, there are no setter and independent from Exception#backtrace. [Feature #8960]
  • eval.c (setup_exception): set backtrace locations for `bt_location' special attribute.
  • vm_backtrace.c (rb_backtrace_to_location_ary): added.
  • internal.h: ditto.
  • test/ruby/test_backtrace.rb: add a test for Exception#backtrace_locations.

#5 [ruby-core:59084] Updated by Koichi Sasada over 2 years ago

  • Status changed from Closed to Feedback
  • % Done changed from 100 to 0
  • Target version changed from 2.1.0 to next minor

Now, I implemented half-baked feature (read-only backtrace locations).

How about to continue how to change it?

#6 [ruby-core:59381] Updated by Charles Nutter over 2 years ago

ko1: I have no problem whatsoever with backtrace_locations being read-only now and forever. I'm glad to see this made it into 2.1 as at least a basic feature.

#7 [ruby-core:76954] Updated by Ryan Nevell 7 days ago

  • Assignee changed from Koichi Sasada to Charles Nutter

Is there any way to re-raise an exception and propagate backtrace_locations? When I want to trap an exception and provide a different exception class and error message, I'm used to doing something like:

rescue => e
  raise MyCustomException, "Error details", e.backtrace

But this is calling set_backtrace, leaving the resulting exception's backtrace_locations nil (on MRI 2.3.1) or and empty array (on jruby 9.1.2.0).

If only some exceptions will have a valid backtrace_locations array (matching the information in backtrace), it is difficult to write code that takes advantage of this feature.

#8 [ruby-core:76957] Updated by Nobuyoshi Nakada 7 days ago

Ryan Nevell wrote:

Is there any way to re-raise an exception and propagate backtrace_locations? When I want to trap an exception and provide a different exception class and error message, I'm used to doing something like:

Nothing right now.

If only some exceptions will have a valid backtrace_locations array (matching the information in backtrace), it is difficult to write code that takes advantage of this feature.

Agree.

Also available in: Atom PDF