2016-10-25 4 views
0

Ich möchte Ausnahme erfassen und auf eine benutzerdefinierte Seite im folgenden Code umleiten. Ausnahmen werden jedoch nicht erkannt.Handle Ausnahme in Play2.5/Scala-Controller

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") 
     } 
    } 
) 
} 

Ich dachte, ich Redirect tun kann() von onComplete Erfolg statt auf Linie markiert „+++“ aber ich habe diese Kompilierungsfehler:

type mismatch; 
[error] found : Unit 
[error] required: play.api.mvc.Result 
[error]   case Some(ue) => 
[error]      ^
[error] one error found 

Ich spiele Dokumentation überprüft, es spricht über Hinzufügen von onServerError zu ErrorHandler (zentralisiert), aber ich möchte wissen, was ich vermisse, indem ich es so mache.

Ich lerne immer noch Scala, jede Hilfe wird sehr geschätzt.

+0

Verwenden Sie 'map' für den guten Fall und' recover' für die Ausnahme. – rethab

Antwort

1

onComplete gibt Unit zurück. Sie können nur Nebeneffekte mit onComplete ausführen.

Verwenden Sie map, flatMap zum Erstellen und Erstellen neuer Berechnungen. Verwenden Sie recover und recoverWith, um Ausnahmen zu behandeln und bei Ausnahmen etwas zurückzugeben.

hier, wie Sie dies tun können

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 Methoden wie map bietet, flatMap neue Berechnungen mit der aktuellen Zukunft. Auch future bietet recover und recoverWith, um Berechnungen zu erstellen, wenn aktuelle Zukunft Ausnahmen auslöst.

def bar: Future[Int] = ??? 

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

Arbeitete - danke !! – srvy