मेरे नियंत्रक कार्रवाई कोड इस तरह दिखता है:कैसे एक playframework 2 Async ब्लॉक में अपवाद को संभालने के लिए (स्केला)
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 (...) की ओर से एक वादा [घटक] लेकिन यह भी फेंक सकता एक कस्टम सत्यापन अपवाद। जब यह अपवाद फेंक दिया जाता है तो मैं टिप्पणी कोड वापस करना चाहता हूं।
वर्तमान में पेज 500 के रूप में प्रस्तुत करने और लॉग में मेरे पास है:
play - Waiting for a promise, but got an error: Ingredient with name 'test' already exists. services.ValidationException: Ingredient with name 'test' already exists.
दो सवाल:
- यह एक बुरा विचार मेरी सेवा से इस अपवाद वापस जाने के लिए है, वहाँ एक बेहतर है इस मामले को संभालने के लिए/अधिक स्केल तरीका?
- मैं अपवाद कैसे प्राप्त करूं?
कुछ दिन पहले एक बग तय किया गया था। [यह प्रतिबद्ध] देखें (https://github.com/playframework/Play20/commit/def888333ea435437edb7f70ca3b7f48877af1c7)। आप अपने 'ग्लोबल' ऑब्जेक्ट के 'ऑनरर' हुक में रनटाइम अपवादों को संभाल सकते हैं। –
लेकिन स्थानीय रूप से अपवाद को पकड़ने का कोई तरीका नहीं है? – Somatik
हां, आप इसे किसी अन्य अपवाद की तरह पकड़ सकते हैं, जैसा कि खेरूद के उत्तर में दिखाया गया है। –