Mi código de acción del controlador se ve así:Cómo manejar excepciones en un bloque playframework 2 asíncrono (Scala)
def addIngredient() = Action { implicit request =>
val boundForm = ingredientForm.bindFromRequest
boundForm.fold(
formWithErrors => BadRequest(views.html.Admin.index(formWithErrors)),
value => {
Async {
val created = Service.addIngredient(value.name, value.description)
created map { ingredient =>
Redirect(routes.Admin.index()).flashing("success" -> "Ingredient '%s' added".format(ingredient.name))
}
// TODO on exception do the following
// BadRequest(views.html.Admin.index(boundForm.copy(errors = Seq(FormError("", ex.getMessage())))))
}
})
}
Mi Service.addIngredient (...) devuelve una promesa [ingrediente], pero también puede lanzar una ValidationException personalizada. Cuando se lanza esta excepción, me gustaría devolver el código comentado.
Actualmente la página se representa como 500 y en los registros que tengo:
play - Waiting for a promise, but got an error: Ingredient with name 'test' already exists. services.ValidationException: Ingredient with name 'test' already exists.
Dos preguntas:
- ¿Es una mala idea para devolver esta excepción de mi servicio, hay una mejor/más forma scala para manejar este caso?
- ¿Cómo atrapo la excepción?
Hubo un error que se ha solucionado hace unos días. Ver [este compromiso] (https://github.com/playframework/Play20/commit/def888333ea435437edb7f70ca3b7f48877af1c7). Puede manejar excepciones de tiempo de ejecución en el gancho 'onError' de su objeto' Global'. –
pero no hay forma de detectar la excepción localmente? – Somatik
Sí, puedes verlo como cualquier otra excepción, como se muestra en la respuesta del kheraud. –