处理来自期货的错误

exceptionFuture 中抛出时,你可以(应该)使用 recover 来处理它。

例如,

def runFuture: Future = Future { throw new FairlyStupidException }

val itWillBeAwesome: Future = runFuture

……将从 Future 中抛出一个 Exception。但是看到我们能够以高概率预测 FairlyStupidException 类型的 Exception,我们可以优雅地处理这个案例:

val itWillBeAwesomeOrIllRecover = runFuture recover { 
    case stupid: FairlyStupidException => 
         BadRequest("Another stupid exception!") 
}

正如你所看到的,recover 的方法是所有 Throwable 的领域,所以你可以只处理几种类型,然后让其余类型进入 Future 堆栈中更高级别的异常处理。

请注意,这类似于在非 Future 上下文中运行以下代码:

def runNotFuture: Unit = throw new FairlyStupidException

try {
    runNotFuture
} catch {
    case e: FairlyStupidException => BadRequest("Another stupid exception!")
}

处理 Futures 中产生的异常非常重要,因为大部分时间它们都更隐蔽。它们通常不会全部通过,因为它们在不同的执行上下文和线程中运行,因此在它们发生时不会提示你修复它们,特别是如果你没有注意到日志中的任何内容或者应用。