これを行うためのハックがあるようです。これは、しかし非常に良いではありません。
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
出典:How can I get source and variable values in ruby tracebacks?
私はRBXはあなたに役立つことができ、いくつかのきちんとした 'Backtrace'オブジェクトを持っていた思い出すのにルビー渡って機能するソリューションを認識していないです。おそらくあなたが達成しようとしているものを拡大できますか? – riffraff
@riffraffもし私がそれをよりよく説明できれば、私は知らない。私は(この例では)aの値を取得する必要があります。実世界のシナリオでは、2倍のブロックが繰り返しブロックであり、毎回CSVファイルから1行を取得するとします。ある時点(CSVファイルの行番号203445)で例外が発生します。さて、私はその行番号に行くことができます。特定の回線が「OK」であるかどうかをチェックするためにCSVファイルに格納します。あるいは、私は救助してデバッガセッションを開始することができます。この時点で。私はバインディングを見ることができるようにする必要があります。例外の瞬間に – Vassilis
ありがとうございました。私が尋ねる理由は、同様の状況では、doブロック内にエラー管理コードがあるため、それは元の質問に答えることはできませんが、あなたのシナリオに合うように見えるだろう、私は恐れています。私が示唆できるのは、エラーがネイティブコードでない場合、呼び出し元バインディングを格納するためにraise/failをオーバーライドできますが、それは半分の解決策に過ぎません。 – riffraff