Ruby Thread.abort\u on\u异常在何处引发?
当在\u exception=true上使用Ruby Thread.abort\u on\u异常在何处引发?,ruby,multithreading,Ruby,Multithreading,当在\u exception=true上使用Thread.abort_时,将在主线程中重新恢复线程中未处理的异常 现在,它看起来可以在任何时候提出,这导致了一些问题,使它真的很难使用 例如: # frozen_string_literal: true require("logger") Thread.abort_on_exception = true Thread.new do raise(Exception) end Logger.new(STDOUT).info("FOO")
Thread.abort_时,将在主线程中重新恢复线程中未处理的异常
现在,它看起来可以在任何时候提出,这导致了一些问题,使它真的很难使用
例如:
# frozen_string_literal: true
require("logger")
Thread.abort_on_exception = true
Thread.new do
raise(Exception)
end
Logger.new(STDOUT).info("FOO")
sleep
运行此代码有时会打印:
❯ ruby ruby_fail.rb
I, [2019-12-20T08:08:12.308942 #41552] INFO -- : FOO
#<Thread:0x00007f90f21dd0c8@ruby_fail.rb:7 run> terminated with exception (report_on_exception is true):
Traceback (most recent call last):
ruby_fail.rb:8:in `block in <main>': Exception (Exception)
log writing failed. Exception
❯ ruby_fail.rb
一、 [2019-12-20T08:08:12.308942#41552]信息--:FOO
#异常终止(异常报告为真):
回溯(最近一次呼叫最后一次):
ruby_fail.rb:8:in'block in':异常(Exception)
日志写入失败。例外情况
这个过程一直在运行。
但是,有时它会打印:
❯ ruby ruby_fail.rb
I, [2019-12-20T08:08:19.861318 #41971] INFO -- : FOO
#<Thread:0x00007feb5012d048@ruby_fail.rb:7 run> terminated with exception (report_on_exception is true):
Traceback (most recent call last):
ruby_fail.rb:8:in `block in <main>': Exception (Exception)
Traceback (most recent call last):
ruby_fail.rb:8:in `block in <main>': Exception (Exception)
❯ ruby_fail.rb
一、 [2019-12-20T08:08:19.861318#41971]信息--:FOO
#异常终止(异常报告为真):
回溯(最近一次呼叫最后一次):
ruby_fail.rb:8:in'block in':异常(Exception)
回溯(最近一次呼叫最后一次):
ruby_fail.rb:8:in'block in':异常(Exception)
这个过程就结束了
这似乎是一个时间问题。标准的Ruby logger,因此如果它在主线程中被提升,就像它在日志中一样,logger将捕获它并忽略它
这是ruby bug吗?如果没有…使用Thread.abort\u on\u exception
似乎毫无用处,因为这是不可预测的
使用Ruby 2.6.5“标准Ruby logger会解救异常,因此如果在主线程中引发异常,就像记录日志一样,logger会捕获它并忽略它…”您从哪里得到这个假设的?仅仅实例化一个记录器(正如您在示例中所做的那样)不会捕获任何异常。我还打电话给.info(“FOO”)
,它实际上是在记录。它在这里救援:“标准的Ruby logger救援异常,所以如果它在主线程中被引发,就像它在日志记录一样,记录器将捕获它并忽略它…”你从哪里得到这个假设的?仅仅实例化一个记录器(正如您在示例中所做的那样)不会捕获任何异常。我还打电话给.info(“FOO”)
,它实际上是在记录。它在这里拯救: