Project

General

Profile

Feature #8960

Add Exception#backtrace_locations

Added by headius (Charles Nutter) over 3 years ago. Updated 7 months ago.

Status:
Assigned
Priority:
Normal
Target version:
-
[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 ko1 (Koichi Sasada) over 3 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 ko1 (Koichi Sasada) over 3 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 ko1 (Koichi Sasada) over 3 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 ko1 (Koichi Sasada) over 3 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 ko1 (Koichi Sasada) over 3 years ago

  • Category set to core
  • Target version set to 2.1.0
  • Assignee set to ko1 (Koichi Sasada)

I'll try before preview-2.

JRuby already has a implementation and tests?

#2 [ruby-core:57489] Updated by headius (Charles Nutter) over 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 nobu (Nobuyoshi Nakada) over 3 years ago

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

#4 Updated by ko1 (Koichi Sasada) over 3 years ago

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

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 ko1 (Koichi Sasada) over 3 years ago

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

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

How about to continue how to change it?

#6 [ruby-core:59381] Updated by headius (Charles Nutter) over 3 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 ryannevell (Ryan Nevell) 10 months ago

  • Assignee changed from ko1 (Koichi Sasada) to headius (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 nobu (Nobuyoshi Nakada) 10 months 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.

#9 [ruby-core:78343] Updated by shyouhei (Shyouhei Urabe) 7 months ago

  • Status changed from Feedback to Assigned
  • Assignee changed from headius (Charles Nutter) to ko1 (Koichi Sasada)

#10 [ruby-core:78361] Updated by shyouhei (Shyouhei Urabe) 7 months ago

We looked at this issue today. It turned out that ruby do not fully implement what was needed originally now. Reopened the ticket to assign ko1.

Also available in: Atom PDF