mã hành động điều khiển của tôi trông như thế này:Làm thế nào để xử lý các trường hợp ngoại lệ trong một play framework 2 Async khối (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())))))
}
})
}
Service.addIngredient của tôi (...) trả về một Promise [Thành phần] nhưng cũng có thể ném một ValidationException tùy chỉnh. Khi ngoại lệ này được ném, tôi muốn trả lại mã nhận xét.
Hiện nay trang này hiển thị như 500 và trong các bản ghi tôi có:
play - Waiting for a promise, but got an error: Ingredient with name 'test' already exists. services.ValidationException: Ingredient with name 'test' already exists.
Hai câu hỏi:
- có phải là một ý tưởng tồi để trở lại ngoại lệ này từ dịch vụ của tôi, là có một tốt hơn/nhiều scala cách để xử lý trường hợp này?
- Làm cách nào để nhận ngoại lệ?
Có lỗi đã được khắc phục cách đây vài ngày. Xem [cam kết này] (https://github.com/playframework/Play20/commit/def888333ea435437edb7f70ca3b7f48877af1c7). Bạn có thể xử lý các ngoại lệ thời gian chạy trong móc 'onError' của đối tượng' Global' của bạn. –
nhưng không có cách nào để bắt ngoại lệ tại địa phương? – Somatik
Có, bạn có thể bắt nó giống như bất kỳ ngoại lệ nào khác, như được hiển thị trong câu trả lời của kheraud. –