Ruby线程:如何在不调用.join的情况下捕获异常?
如何在不使用.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
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、 在最后加入。一般规则:不要等待线程,直到你需要。