gpt4 book ai didi

scala - Await.result(...) Scala 2.10 中 fatal error 和异常处理之间的区别

转载 作者:行者123 更新时间:2023-12-02 03:34:59 24 4
gpt4 key购买 nike

为什么 Await.result(f, t) 会重新抛出 f 引发的异常,而不会重新抛出 fatal error ?

这是错误还是预期的行为?

以下 REPL 序列重现了该行为:

scala> import scala.concurrent.duration._
import scala.concurrent.duration._

scala> import scala.concurrent._
import scala.concurrent._

scala> val ec = scala.concurrent.ExecutionContext.global
ec: scala.concurrent.ExecutionContextExecutor = scala.concurrent.impl.ExecutionContextImpl@2d2217da

scala> Await.result(Future{throw new RuntimeException()}(ec), Duration.Inf)
java.lang.RuntimeException
at $anonfun$1.apply(<console>:15)
at $anonfun$1.apply(<console>:15)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at scala.concurrent.impl.ExecutionContextImpl$$anon$3.exec(ExecutionContextImpl.scala:107)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)


scala> Await.result(Future{throw new LinkageError()}(ec), Duration.Inf)
scala.NotImplementedError: an implementation is missing
at $line28.$read$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$1.apply(<console>:15)
at $line28.$read$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$1.apply(<console>:15)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at scala.concurrent.impl.ExecutionContextImpl$$anon$3.exec(ExecutionContextImpl.scala:107)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
(hanging - needs ctrl-c)

两次执行之间的区别在于第一次执行将终止执行,第二次将打印堆栈跟踪然后挂起,永远等待(虽然不确定是什么)。

Edit1:将 NotImplementedError 替换为 LinkageError,因为 NotImplementedError 行为已在 2.11.1 中修改,而 LinkageError 保留一样。

Edit2:添加“致命”来描述问题中的错误。

最佳答案

发生这种情况是因为 scala.util.NonFatal(在 Future 的实现中使用)与 NotImplementedError 不匹配,导致它被视为致命的。在 2.11 中,这发生了变化,NotImplementedError 不再是 fatal error 。参见 this commit .

关于scala - Await.result(...) Scala 2.10 中 fatal error 和异常处理之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24072115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com