Как поймать исключение с помощью Iteratee.foreach в будущем

Я использую Play Framework 2.2 и ReactiveMongo. Я перебираю все полученные записи из ReactiveMongo и получаю некоторое свойство из одной записи. Иногда выдает Exception of inexistent property, как мне его поймать, сейчас простое "восстановление" не работает.

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
}

person Michał Jurczuk    schedule 23.09.2015    source источник


Ответы (1)


Iteratee.foreach всегда возвращает тип Unit, поэтому значение processingData не будет содержать данных, и перечислитель применит некоторый Iteratee, только прикрепит iteratee к эмулятору, но не запустит его. Я думаю, это должно решить вашу проблему:

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 
person MrRontgen    schedule 13.10.2015