gpt4 book ai didi

scala - Future 何时可以返回不是从 Future 体内抛出的异常?

转载 作者:行者123 更新时间:2023-12-02 20:55:59 25 4
gpt4 key购买 nike

这里更普遍的问题是:在生产质量代码中,是否需要关心 ExecutionContext 或其他并发基础设施在 future 主体执行之外产生的异常?例如,如果线程池发生某些故障,我是否会在将来看到返回的异常,从而导致执行失败?

这反过来又导致了如何对 future 进行错误处理。我同意一般建议,应该返回错误,而不是抛出错误,例如使用要么要么要么 scalatical 的 Or。但是,如果在调用 future 时,需要考虑基础设施中的异常,即使其他所有内容都是以无异常或异常包装的方式编写的,这似乎会非常复杂。但我不会就此寻求建议——我认为这会让这篇文章因“太宽泛”而被关闭。 :=(

最佳答案

如果在执行 Future 时发生异常但不在其主体中,我认为它不可能在该 Future 内返回。 Future.apply 的实现提交 PromiseCompletingRunnable给执行人。它看起来像这样:

class PromiseCompletingRunnable[T](body: => T) extends Runnable {
val promise = new Promise.DefaultPromise[T]()

override def run() = {
promise complete {
try Success(body) catch { case NonFatal(e) => Failure(e) }
}
}
}

请注意,底层的 Promise 是通过使用执行 Future.apply 主体的 try/catch block 来完成的。如果上面的 Runnable 中发生异常(看起来不太可能),或者 try/catch block 之外的执行器中发生异常,则它不会被包装在返回的 Future 中。如果执行器中发生一些异常,更可能的情况是这是一些 fatal error 。更糟糕的是,这可能意味着 future 永远不会完成。

如果是线程池导致了问题,那么除了寻找更好的线程池或确定根本问题(线程太多?)之外,您实际上无能为力。在运行时你能做的甚至更少(如果有的话)。实际上,这只是意味着底层并发 API 非常糟糕,使用了太多内存等等。

关于scala - Future 何时可以返回不是从 Future 体内抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29980438/

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