如何在未来使用Iteratee.foreach捕获异常

时间:2015-09-23 14:45:15

标签: future playframework-2.2 reactivemongo iterate

我使用Play Framework 2.2和ReactiveMongo。我正在迭代来自ReactiveMongo的所有收到的条目,并从单个条目中获取一些属性。有时它会抛出不存在的属性的异常,我应该如何捕获它,现在使用简单的" recover"不起作用。

val cursor:Cursor[JsObject] = // QUERY FOR DATA
val processingData = cursor.enumerate().apply(Iteratee.foreach { doc =>
    (doc \ "property")
}

processingData.map { data =>
    Logger.info(s"$data")
    None
}.recover {
    case e =>
        Logger.error(s"Error during parsing $e")
        None
}

1 个答案:

答案 0 :(得分:0)

Iteratee.foreach总是返回单位类型,因此值processingData将不包含数据,枚举器应用一些Iteratee仅将iteratee附加到emumerator,但不要运行它。我想,这必须解决你的问题:

val cursor:Cursor[JsObject] = // QUERY FOR DATA

val getData = Enumeratee.mapM[JsObject]{doc => 
   Future(doc \ "property") //use future to catch exception here
}

val processingData: Future[scala.List[JsObject]] = cursor.enumerate() &> getData .run Iteratee.getChunks