2016-10-25 5 views
0

Я хотел бы перехватить исключение и перенаправить на пользовательскую страницу в следующем коде. Однако исключения не пойманы/не видны.Исключение обработки в контроллере 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, любая помощь глубоко оценена.

+0

Используйте 'map' для хорошего случая и' recover' для исключения. – rethab

ответ

1

onCompleteUnit. Вы можете выполнять только операции с побочным эффектом, используя onComplete.

Использовать map, flatMap для составления и построения новых вычислений. Используйте recover и recoverWith для обработки исключений и возврата чего-либо к исключениям.

вот как вы можете это сделать

val result = 
for { 
ueOpt <- usersService.findUserEntryByEmail(request.identity.email) 
result <- ueOpt match { 
      case Some(ue) => 

       val itemObj = Item(item.name, item.description, ue.companyId) 
       val foo = itemsService.addItemWithParts(itemObj, Seq(item.parts)) 

       foo.map { value => 
       Redirect(controllers.www.routes.Dashboard.dashboard) 
       }.recover { case th => 
       InternalServerError("bad things happen in life.") 
       } 

      case None => Future.successful(BadRequest("no item found")) 
      } 
} yield result 

Future предоставляет такие методы, как map, flatMap строить новые вычисления с результатом текущего будущего. Также будущее предоставляет recover и recoverWith для построения вычислений, когда текущее будущее выдает исключения.

def bar: Future[Int] = ??? 

bar.map { intValue => 
    //doSomething 
}.recover { 
    case ex: SQLException => //return some value 
    case _ => //ignore other exceptions and return default value 
} 
+0

Работал - спасибо! – srvy