处理上阶期货意外的异常(Handling unexpected exceptions on scal

2019-10-20 22:02发布

当使用类似下面的一些代码:

scala> Future { null } onComplete { case Success(v) => v.toString }

斯卡拉抛出以下异常:

scala> java.lang.NullPointerException
    at $line14.$read$$iw$$iw$$anonfun$2.apply(<console>:11)
    at $line14.$read$$iw$$iw$$anonfun$2.apply(<console>:11)
    at     scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
    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)

这将是美好的,因为我不处理任何异常。 问题是,我的应用程序完全挂起。

我使用concurrent.ExecutionContext.Implicits.global ,我想onComplete在此全局执行上下文中执行。 问题是,它似乎像执行上下文停止接受任何工作,并且应用程序只是挂起。

我一定要明确使用try ... catch让我意想不到的事情发生保护我的应用程序的情况下onComplete

谢谢

Answer 1:

IIRC,这只是在非常早的实现问题。

你可以提供一个处理程序或“报告”:

scala> import util._
import util._

scala> import concurrent._
import concurrent._

scala> ExecutionContext.fromExecutor(null, (t: Throwable) => println(s"Hi, $t"))
res0: scala.concurrent.ExecutionContextExecutor = scala.concurrent.impl.ExecutionContextImpl@221a3fa4

scala> implicit val x = res0
x: scala.concurrent.ExecutionContextExecutor = scala.concurrent.impl.ExecutionContextImpl@221a3fa4

scala> Future { null } onComplete { case Success(v) => v.toString }
<console>:16: warning: match may not be exhaustive.
It would fail on the following input: Failure(_)
              Future { null } onComplete { case Success(v) => v.toString }
                                         ^
Hi, java.lang.NullPointerException

scala> 

一切处理。



Answer 2:

首先,该NullPointerException你无关与未来; 它不会在里面发生Future块。

你可以做的,是包装代码可能返回nullOption()
然后,您的代码应该是这样的:

Future { Option(mightBeANull) } onComplete { case Success(v) => v.map(_.toString) }


文章来源: Handling unexpected exceptions on scala Futures