【问题标题】:How to catch exceptions inside threads如何捕获线程内的异常
【发布时间】:2015-03-14 00:28:30
【问题描述】:

为什么线程的行为与 ruby​​ 中的其他所有内容不同? 我需要在不同的线程中运行一些代码,而不是让它们在每次意外发生时都消失得无影无踪。

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

出于某种原因,这段代码什么也没做。在此之前我尝试使用Thread::abort_on_exception = true,并没有改变任何事情。

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

【问题讨论】:

  • 您发布的代码在 IRB 中对我来说很好用。我怀疑问题是您的程序在新线程完成执行之前终止。
  • 异常中止什么都不做,因为它不会引发异常。如果你真的希望它 abort_on_exception 要么不在线程内处理它们,要么在处理后重新引发它们。

标签: ruby multithreading exception-handling


【解决方案1】:

你忘了join()你的帖子。此代码有效:

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

【讨论】:

  • 这是否意味着我必须等待该代码完成才能继续?我需要让代码并排运行^^
  • 您的程序在线程之前完成。而不是join(只是“等待线程”),您可以在程序末尾放置一些sleep,您会看到线程已执行
【解决方案2】:

正如 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

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 2011-09-26
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多