4

我需要立即捕获线程中的异常并停止所有线程,因此我在脚本中使用了 abort_on_exception。不幸的是,这意味着异常不会引发到父线程 - 也许这是因为异常最终发生在全局范围内?

无论如何,这是一个显示问题的示例:

Thread.abort_on_exception = true

begin
  t = Thread.new {
    puts "Start thread"
    raise saveMe
    puts "Never here.."
  } 
  t.join
rescue => e
  puts "RESCUE: #{e}"
ensure
  puts "ENSURE"
end

使用 abort_on_exception 时,如何挽救线程中引发的异常?

这是一个新的例子,它展示了更令人难以置信的东西。线程能够在开始块内终止执行,但它不会引发任何异常?

Thread.abort_on_exception = true
begin
  t = Thread.new { raise saveMe }                     
  sleep 1
  puts "This doesn't execute"
rescue => e 
  puts "This also doesn't execute"
ensure
  puts "But this does??"
end   
4

1 回答 1

5

啊——我想通了。

abort_on_exception 显然会发送中止。该线程无关紧要,我们的救援也不会看到基本中止:

begin
  abort
  puts "This doesn't execute"
rescue => e
  puts "This also doesn't execute"
ensure
  puts "But this does??  #{$!}"
end   

解决方案是使用“救援异常”,它也会捕获中止。

begin
  abort
  puts "This doesn't execute"
rescue Exception => e
  puts "Now we're executed!"
end   
于 2012-11-03T05:45:32.460 回答