Я хотел бы перехватить исключение и перенаправить на пользовательскую страницу в следующем коде. Однако исключения не пойманы/не видны.Исключение обработки в контроллере Play2.5/scala
def addItemWithParts(item: Item, parts: Seq[String]): Future[Int] = {
... // May throw exceptions
}
def handleAddItem = auth.SecuredAction.async { implicit request =>
itemForm.bindFromRequest.fold(
formWithErrors => {
Future.successful(
Redirect(controllers.www.routes.ItemController.startAddItem()).flashing(
"error" -> "Bad item add input"
)
)
},
item => {
for {
ue <- usersService.findUserEntryByEmail(request.identity.email)
} yield ue match {
case Some(ue) =>
val itemObj = Item(item.name, item.description, ue.companyId)
val xx = itemsService.addItemWithParts(itemObj, Seq(item.parts)) <-- want to catch exception thrown by this function
/*
* COMMENTED CODE PRINTS EXCEPTION ON CONSOLE, BUT DONT KNOW HOW TO REDIRECT/OK...
xx onComplete {
case Success(x) => {
println("Added ITEM: " + x)
Redirect(controllers.www.routes.Dashboard.dashboard)
}
case Failure(exp) => {
println("Exception while adding ITEM: " + exp)
Ok("Got exception: " + exp)
}
}
*/
Redirect(controllers.www.routes.Dashboard.dashboard) // +++
case None =>
Ok("Bad")
}
}
)
}
Я думал, что я могу сделать редирект() от OnComplete успеха, а не на линии, отмеченные «+++», но я получаю эту ошибку компиляции:
type mismatch;
[error] found : Unit
[error] required: play.api.mvc.Result
[error] case Some(ue) =>
[error] ^
[error] one error found
Я проверил игровую документацию, он говорит о добавляя onServerError к ErrorHandler (централизованно), но я хочу знать, чего мне не хватает при этом.
Я все еще изучаю Scala, любая помощь глубоко оценена.
Используйте 'map' для хорошего случая и' recover' для исключения. – rethab