Issue #13557 has been updated by byroot (Jean Boussier).
I'll try to find some time to implement this in the near future, because I just ran
into this today, and resorted to the following hack:
```ruby
unless exception.backtrace
begin
raise exception
rescue exception.class => raised_exception
raised_exception.backtrace.shift
raised_exception.backtrace_locations.shift
exception = raised_exception
end
end
```
I think both `Kernel#raise` and `Exception#set_backtrace` would need to accept array of
`Thread::Backtrace::Location`.
----------------------------------------
Feature #13557: there's no way to pass backtrace locations as a massaged backtrace
https://bugs.ruby-lang.org/issues/13557#change-106824
* Author: sylvain.joyeux (Sylvain Joyeux)
* Status: Open
* Priority: Normal
----------------------------------------
When re-raising exceptions, it is sometimes useful to "massage" the backtrace
(especially in DSLs).
There is currently no way to do it using only backtrace locations. This causes the new
exception to have #backtrace_locations return nil, and thus makes backtrace_locations
unreliable as a whole.
Example:
~~~
def test
raise ArgumentError, "", caller_locations
end
begin
test
rescue ArgumentError => e
p e.backtrace_locations
end
~~~
attempting to pass `caller_location` to `Kernel#raise` in the `test` method fails with
`bla.rb:2:in `set_backtrace': backtrace must be Array of String (TypeError)`
--
https://bugs.ruby-lang.org/