Когда я звоню Exception#backtrace_locations
, как правило, возвращает массив, как и предполагалось:У ArgumentError нет backtrace_locations?
begin
raise "foo"
rescue => e
p e.backtrace_locations
end
# => ["this_file:2:in `<main>'"]
Это то же самое, если я поднять ArgumentError
вручную:
begin
raise ArgumentError.new
rescue => e
p e.backtrace_locations
end
# => ["this_file:2:in `<main>'"]
Однако, когда я поднимаю реальный ArgumentError
по вызывая метод с неправильным количеством аргументов, backtrace_locations
- nil
, что для меня неожиданно:
def foo; end
begin
foo(:bar)
rescue => e
p e.backtrace_locations
end
# => nil
При одной и той же ситуации, классические Exception#backtrace
возвращает массив, как задумано:
def foo; end
begin
foo(:bar)
rescue => e
p e.backtrace
end
# => ["this_file:1:in `foo'", "this_file:4:in `<main>'"]
возвращаемое значение Exception#backtrace_locations
будучи nil
в третьем случае, описанном выше предназначены ли? Если да, то когда Exception#backtrace_locations
станет nil
? Есть ли для этого документация? Или это ошибка Ruby?
На данный момент, я думаю, что это ошибка, и reported it.
Похоже, (если это та же проблема), это еще не в 2.1: https://bugs.ruby-lang.org/issues/8960 – CDub
@CDUB Что значит, что он еще не включен? Предполагается, что он будет реализован в редакции 44170. И метод возвращает 'nil'; он определен. Если он не определен, то он должен скорее повысить неопределенную ошибку. – sawa
За последний комментарий 12 дней назад в вышеперечисленном потоке: «Целевая версия изменилась с текущей: 2.1.0 до следующего второстепенного» ... Я читал, что как «это будет в следующем младшем выпуске, это не в 2.1.0 «. – CDub