2013-09-16 53 views
4

如何從最後一行中的bar看起來像是從那裏來的,而不是從塊中重新生成異常?我想在回溯中看到bar從不同的地方重新提高紅寶石異常

begin 
    raise "foo" 
rescue => e # yeah, i know 
    $e = e # oh boy, globals 
end 

sleep 1 # again, i know 

def bar 
    raise $e 
end 

bar # => test.rb:2:in `<main>': foo (RuntimeError) 

編輯:

目前回溯是

test.rb:2:in `<main>': foo (RuntimeError) 

我想是(或某物類似)

test.rb:10:in `bar': foo (RuntimeError) 
from test.rb:13:in `<main>' 
+0

很好問題,確實* + 1 * .. –

+3

你想在回溯中究竟做什麼?只是酒吧,還是原來的回溯? – BroiSatse

+0

我不知道你想要什麼,但你可能會考慮閱讀更多關於異常的一般信息,看看這是否是正確的概念方法。 **請發佈你現在得到的回溯,以及你想要的** –

回答

1

我不知道這是你想要的,但你可以嘗試:

begin 
    raise "foo" 
rescue => e 
    $e = e 
end 

sleep 1 

def get_full_stack 
    caller 
end 

def bar 
    exception = $e.dup 
    exception.set_backtrace get_full_stack 
    raise exception 
end 
+0

這可以工作,用'Kernel.caller'替換'get_full_stack'。謝謝! –

1

我不知道這是否是正確答案。但是,我決定給它一個去:-)

begin 
    raise "foo" 
rescue => e 
    $e = e 
end 

sleep 1 

def bar  
    raise $e.class, "bar" 
end 

bar #=> test.rb:10:in `bar': bar (RuntimeError) 
    from test.rb:13:in `<main>' 

第二次嘗試

begin 
    ... 
end 

sleep 1 

def bar 
    $e.set_backtrace(["bar"])  
    raise $e 
end 

bar #=> bar: foo (RuntimeError) 
+0

我試圖澄清這個問題。另外,我不希望代碼知道有關異常的更多信息,因爲它可能包含的不僅僅是一個字符串。 –