Как обрабатывать исключения в асинхронном блоке playframework 2 (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())))))
        }
      })
  }

My Service.addIngredient (... )возвращает Promise[Ingredient], но также может вызывать пользовательское исключение ValidationException. Когда это исключение выдается, я хотел бы вернуть закомментированный код.

В настоящее время страница отображается как 500, а в журналах у меня:

play - Waiting for a promise, but got an error: Ingredient with name 'test' already exists. services.ValidationException: Ingredient with name 'test' already exists.

Два вопроса:

  • Плохо ли возвращать это исключение из моей службы, есть ли лучший/более Scala способ справиться с этим случаем?
  • Как поймать исключение?
10
задан Somatik 5 June 2012 в 13:58
поделиться