Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Thread.abort\u on\u异常在何处引发?_Ruby_Multithreading - Fatal编程技术网

Ruby Thread.abort\u on\u异常在何处引发?

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")

当在\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")

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”)
,它实际上是在记录。它在这里拯救: