Могу ли я получить доступ к привязке в момент исключения в Ruby - PullRequest
7 голосов
/ 04 октября 2011

Скажем, у меня есть:

begin
  2.times do
    a = 1
    1/0
  end

rescue
  puts $!
  debugger
end       

В этом примере я хочу получить значение a.Если a инициализируется в блоке begin, я могу получить к нему доступ, когда спасусь.Однако в этом примере a является локальным для блока.Есть ли способ получить привязку в момент исключения, когда я спасаюсь?

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Разве вы не можете просто поместить другой блок begin, rescue внутри блока do?

0 голосов
/ 23 сентября 2012

Кажется, есть возможность взломать это. Это не очень приятно, хотя:

class Foo < Exception
  attr_reader :call_binding

  def initialize
    # Find the calling location
    expected_file, expected_line = caller(1).first.split(':')[0,2]
    expected_line = expected_line.to_i
    return_count = 5  # If we see more than 5 returns, stop tracing

    # Start tracing until we see our caller.
    set_trace_func(proc do |event, file, line, id, binding, kls|
      if file == expected_file && line == expected_line
        # Found it: Save the binding and stop tracing
        @call_binding = binding
        set_trace_func(nil)
      end

      if event == :return
        # Seen too many returns, give up. :-(
        set_trace_func(nil) if (return_count -= 1) <= 0
      end
    end)
  end
end

class Hello
  def a
    x = 10
    y = 20
    raise Foo
  end
end
class World
  def b
    Hello.new.a
  end
end

begin World.new.b
rescue Foo => e
  b = e.call_binding
  puts eval("local_variables.collect {|l| [l, eval(l)]}", b).inspect
end

Источник: Как получить значения источника и переменной в трассировках ruby?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...