Ruby 如何捕获线程内的异常

Ruby 如何捕获线程内的异常,ruby,multithreading,exception-handling,Ruby,Multithreading,Exception Handling,为什么线程的行为与ruby中的其他线程不同? 我需要在不同的线程中运行一些代码,而不是让它们在每次意外事件发生时消失在空气中 Thread.new do begin raise "Exception" rescue => exc print exc end end # Nothing happens 出于某种原因,此代码不起任何作用。在此之前,我尝试使用Thread::abort\u on\u exception=true,但没有改

为什么线程的行为与ruby中的其他线程不同? 我需要在不同的线程中运行一些代码,而不是让它们在每次意外事件发生时消失在空气中

Thread.new do
    begin
        raise "Exception"
    rescue => exc
        print exc
    end
end
# Nothing happens
出于某种原因,此代码不起任何作用。在此之前,我尝试使用
Thread::abort\u on\u exception=true
,但没有改变任何事情

那么,如何正确处理ruby线程内部的异常呢?

您忘记了
join()
您的线程。此代码适用于:

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

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

这里有两件事需要考虑:使用
Thread::abort\u on\u exception=true
使程序更易于调试,并避免出现令人讨厌的隐藏bug。第二个问题是,在没有确保每个线程都正确结束的情况下,我不应该退出程序。 代码应改为:

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

你发布的代码在IRB中对我很有用。我怀疑问题在于,您的程序在新线程完成执行之前终止。异常中止不会执行任何操作,因为它不会引发异常。如果您真的想让它在异常时中止,请不要在线程内处理它们,或者在处理后重新引发它们。这是否意味着我必须等待代码完成后才能继续?我需要让代码并排运行^^^在线程之前完成您的程序。您可以在程序末尾放置一些
sleep
,而不是
join
(这只是“等待线程”),您将看到线程已执行