这是一个相当普遍的问题,但希望是合理的问题.何时被ExecutionContext#reportFailure(Throwable)召唤?
它似乎没有在Scala标准库中调用.我想我或许应该在某些情况下称之为?这些是什么?
此方法报告无法以其他方式报告的异常。
当在没有其他方法报告失败的回调执行期间发生异常时,将调用它。特别是,对Future.onComplete(例如 via Future.foreach)的调用返回Unit并可以在任何线程上执行,因此它们无法向调用者报告失败。当 中抛出异常时onComplete,异常会被发送到此方法。
Promise在标准库的实现中,它被调用了几次。参见源码。
try onComplete(value) catch { case NonFatal(e) => executor reportFailure e }
Run Code Online (Sandbox Code Playgroud)
当 future/promise 失败时,可以实现执行任意代码ExecutionContext。reportFailure标准库中唯一实现此方法的是ExecutionContextImpl,它不在公共 API 中,但可以在此处找到。这个类接受一个reporter: Throwable => Unit函数。默认ExecutionContext.Implicits.global使用ExecutionContext.defaultReporter,它只是将堆栈跟踪打印到System.err。
如果您想自定义行为,您可能需要定义自己的ExecutionContext. 很难想象除了记录堆栈跟踪或其他类型的日志记录之外您还希望产生其他副作用的场景。