Scala处理源自期货的错误

示例

当exception从中抛出时Future,您可以(应该)recover用来处理它。

例如,

def runFuture: Future = Future { throw new FairlyStupidException }

val itWillBeAwesome: Future = runFuture

...将Exception在内抛出一个Future。但是看到我们可以预测到一个高概率Exception类型FairlyStupidException,我们可以用一种优雅的方式专门处理这种情况:

val itWillBeAwesomeOrIllRecover = runFuture recover { 
    case stupid: FairlyStupidException => 
         BadRequest("另一个愚蠢的例外!") 
}

正如您所看到的,给定的方法recover是PartialFunctionover的整个域Throwable,因此您可以仅处理某些类型,然后将其余类型放到Future堆栈中更高级别的异常处理中。

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

def runNotFuture: Unit = throw new FairlyStupidException

try {
    runNotFuture
} catch {
    case e: FairlyStupidException => BadRequest("另一个愚蠢的例外!")
}

处理Futures内生成的异常非常重要,因为在很多时候,它们更隐蔽。它们通常不会完全显示在您的面前,因为它们在不同的执行上下文和线程中运行,因此不会在它们发生时提示您修复它们,尤其是如果您在日志中没有注意到任何内容或应用。