【问题标题】:How to capture an exception from another thread如何从另一个线程捕获异常
【发布时间】:2012-11-04 19:36:35
【问题描述】:

如何从另一个线程捕获异常?

  • 我想对某个特定线程执行此操作,而不是其他线程,因此我无法将abort_on_exception 开启至true
  • 我想在主线程中处理异常,所以我不能简单地在异常中引发的线程中处理putspp 等。

我在How to get error messages from ruby threads 中找到了一个建议使用catch 的答案,我认为这是我想要的方式,但我无法完全弄清楚如何去做。或者,还有更好的方法?我还找到了一个建议使用 Queue 类的答案,但担心它可能会矫枉过正。

【问题讨论】:

    标签: ruby multithreading exception-handling


    【解决方案1】:

    如果您打开abort_on_exception,那么您将没有机会捕捉到它。但是,当您对线程执行 join 操作时,您可以将其关闭并简单地捕获它。

    thread = Thread.new do
      raise "Uh oh"
    end
    
    begin
      thread.join
    rescue => e
      puts "Caught exception: #{e}"
    end
    

    另一种方法是让线程捕获自己的异常并将其保存在以后可以从中获取的位置。例如:

    exceptions = { }
    
    Thread.new do
      begin
        raise "Uh oh"
      rescue => e
        exceptions[Thread.current] = e
      end
    end
    
    sleep(1)
    
    puts exceptions.inspect
    # => {#<Thread:0x007f9832889920 dead>=>#<RuntimeError: Uh oh>}
    

    【讨论】:

    • 需要注意的是,当你join线程时,主线程会等待加入线程完成。为了充分利用并发性,请使用第二种方法。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2017-04-07
    • 2011-09-26
    • 2010-12-27
    相关资源
    最近更新 更多