Я хочу выполнить обработку ошибок в своем веб-приложении play scala.
Мое приложение обращается к базе данных для извлечения некоторых строк, это следует за потоком.
- Первый вызов db для получения некоторых данных
- Используйте данные в первом вызове для извлечения других данных из db
- Введите ответ, используя данные, полученные из последних двух вызовов db.
Ниже мой псевдокод.
def getResponse(name: String)
(implicit ctxt: ExecutionContext): Future[Response] = {
for {
future1 <- callFuture1(name)
future2 <- callFuture2(future1.data)
future3 <- callFuture3(future1.data, future2.data)
} yield future3
}
Каждый метод, описанный выше, возвращает будущее, подпись этих методов приведена ниже.
private def callFuture1(name: String)
(implicit ctxt: ExecutionContext): Future[SomeType1] {...}
private def callFuture2(keywords: List[String])
(implicit ctxt: ExecutionContext): Future[SomeType2] {...}
private def callFuture3(data: List[SomeType3], counts: List[Int])
(implicit ctxt: ExecutionContext): Future[Response] {...}
Как мне сделать обработку ошибок/сбоев, в следующей ситуации
- Когда callFuture1 не может получить данные из базы данных. я хочу вернуться соответствующий ответ об ошибке с сообщением об ошибке. Поскольку callFuture2 только выполняется после вызоваFuture1. Я не хочу выполнять callFuture2, если callFuture1 не удалось/ошибочно и захочет вернуться сообщение об ошибке немедленно. (То же самое для callFuture2 и callFuture3)
- редактировать -
Я пытаюсь вернуть соответствующий метод Error Response из метода getResponse(), когда любой из вызововFuture не работает и не переходит к последующим будущим.
Я попробовал следующее, основанное на ответе Питера Нейнса, но дал мне ошибку времени выполнения.
def getResponse(name: String)
(implicit ctxt: ExecutionContext): Future[Response] = {
for {
future1 <- callFuture1(name) recoverWith {
case e:Exception => return Future{Response(Nil,Nil,e.getMessage)}
}
future2 <- callFuture2(future1.data)
future3 <- callFuture3(future1.data, future2.data)
} yield future3
}
Ошибка выполнения я get
ERROR] [08/31/2015 02:09:45.011] [play-akka.actor.default-dispatcher-3] [ActorSystem(play)] Uncaught error from thread [play-akka.actor.default-dispatcher-3] (scala.runtime.NonLocalReturnControl)
[error] a.a.ActorSystemImpl - Uncaught error from thread [play-akka.actor.default-dispatcher-3]
scala.runtime.NonLocalReturnControl: null