Project

General

Profile

Feature #8960

Add Exception#backtrace_locations

Added by Charles Nutter about 3 years ago. Updated 12 days ago.

Status:
Assigned
Priority:
Normal
Assignee:
[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 almost 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 Koichi Sasada almost 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 Koichi Sasada almost 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 Koichi Sasada about 3 years ago

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

I'll try before preview-2.

JRuby already has a implementation and tests?

#2 [ruby-core:57489] Updated by Charles Nutter about 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 almost 3 years ago

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

#4 Updated by Koichi Sasada almost 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 Koichi Sasada almost 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 Charles Nutter almost 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 Ryan Nevell 4 months 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 4 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 Urabe 12 days ago

  • Status changed from Feedback to Assigned
  • Assignee changed from Charles Nutter to Koichi Sasada

#10 [ruby-core:78361] Updated by Shyouhei Urabe 12 days 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