从不同的地方重新引发Ruby异常

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)

what I want is (or sth similar)

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

非常好的问题,确实是这样 +1 .. - Arup Rakshit
3
您希望在回溯中包含什么?只有 "bar" 还是同时包含原始的回溯信息? - BroiSatse
我还不确定你想要什么,但你可以考虑更多地了解异常处理的一般知识,看看这是否是正确的概念方法。请提供您现在获取的回溯信息以及您想要的结果。 - New Alexandria
我已经编辑了问题,包括我正在获取的回溯和我想要的回溯。这段代码背后的想法是,我想从一个线程(执行网络操作)发送异常到另一个线程(等待网络操作发生)。 - lucas clemente
2个回答

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)

我已经尝试澄清问题。此外,我不希望代码过多地了解异常,因为它可能包含的不仅仅是字符串。 - lucas clemente

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

这很有效,用Kernel.caller替换get_full_stack。谢谢! - lucas clemente

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接