Ruby线程:如何在不调用.join的情况下捕获异常?

Ruby线程:如何在不调用.join的情况下捕获异常?,ruby,multithreading,Ruby,Multithreading,如何在不使用.join的情况下观察和挽救线程中发生的错误?我现在拥有的代码: Thread.abort_on_exception = true begin a = Thread.new { errory_code } rescue Exception => detail puts detail.message end sleep 1 #so that thread has enough time to execute 如果我理解正确,Thread.abort\u on

如何在不使用.join的情况下观察和挽救线程中发生的错误?我现在拥有的代码:

Thread.abort_on_exception = true
begin
    a = Thread.new { errory_code }
rescue Exception => detail
    puts detail.message
end

sleep 1 #so that thread has enough time to execute 
如果我理解正确,Thread.abort\u on\u exception=true将中止线程执行,即引发异常。但为什么救援没有抓住它呢

您希望营救操作能够捕获在Ruby退出后很长时间内运行的一段代码中的异常,这段代码将开始。。。端块。那是不会发生的

记住,当你处理线程时,事情是无序发生的

您可以捕捉到的唯一例外是与线程创建相关的例外。线程内部发生的是一个完全不同的世界


使用join强制代码等待线程完成,以便获得正确的顺序。然后可以捕获线程异常。

我找到了方法-我只需要将线程的内部封装到一个救援块中,如下所示:

Thread.abort_on_exception = true

a = Thread.new do 
    begin                      #new
        errory_code 
    rescue Exception => detail #new
        puts detail.message    #new
    end                        #new
end

sleep 1 #so that thread has enough time to execute 

这是一个非常明显的解决方案,-但是,因为我花了这么长时间才想到它,希望它能帮助一些人。

Hm。那么还有其他排序方法吗?我不能使用.join,因为许多连接需要位于不同的位置-这将导致它们等待彼此完成。我可以在不同的地方有两个独立的线程,并捕获其中的异常,并知道该异常发生在哪个线程中吗?线程不会等待,但您的外部线程管理代码会等待。如果您需要在继续之前将它们全部完成,那么在它们全部完成之前,对每一个调用join并没有害处。这将简单地等待运行时间最长的线程完成,而不考虑顺序;a、 加入;b=Thread.new{5.times{k | pk};b、 加入;b线程将等待一个线程完成后再开始。任何一个连接点都将停止执行,直到子线程完成。相反,只需做a.加入;b、 在最后加入。一般规则:不要等待线程,直到你需要。