如何捕获线程内的异常

时间:2015-01-15 15:03:58

标签: ruby multithreading exception-handling

为什么线程的行为与ruby中的其他内容不同? 我需要在不同的线程中运行一些代码,并且每次出现意外情况时都不会让它们消失。

Thread.new do
    begin
        raise "Exception"
    rescue => exc
        print exc
    end
end
# Nothing happens

由于某种原因,此代码不执行任何操作。我之前尝试使用Thread::abort_on_exception = true,不会改变任何事情。

那么,我如何正确处理ruby线程中的异常?

2 个答案:

答案 0 :(得分:2)

你忘记了join()你的主题。此代码有效:

Thread.new do
    begin
        raise "Exception"
    rescue => exc
        print exc
    end
end.join

答案 1 :(得分:1)

正如Ajedi32所说,问题是程序在线程有时间写“异常”之前完成。

这里有两件事需要考虑:使用Thread::abort_on_exception = true使程序更容易调试并避免出现令人讨厌的隐藏错误。我不应该退出程序而不确保每个线程正确结束的秒。 代码应该是:

Thread::abort_on_exception = true 
my_thread = Thread.new do
    begin
        raise "Exception"
    rescue => exc
        print exc
    end
end

#Do some parallel stuff
my_thread.join