处理来自期货的错误
当 exception
从 Future
中抛出时,你可以(应该)使用 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!")
}
处理 Future
s 中产生的异常非常重要,因为大部分时间它们都更隐蔽。它们通常不会全部通过,因为它们在不同的执行上下文和线程中运行,因此在它们发生时不会提示你修复它们,特别是如果你没有注意到日志中的任何内容或者应用。