2014-08-29 2 views
3

Я использую play framework (2.3.x) для создания безопасного API.Обработка исключений в платформе воспроизведения

Сегодня у меня есть блок try/catch, окружающий все мои функции api в контроллере API, чтобы улавливать исключения и возвращать общий объект «error json».

Пример:

def someApiFuntion() = Action { implicit request => 
    try { 
     // Do some magic 
     Ok(magicResult) 
    } catch { 
     case e: Exception => 
      InternalServerError(Json.obj("code" -> INTERNAL_ERROR, "message" -> "Server error")) 
    } 
} 

Мой вопрос: нужно, чтобы попробовать/поймать штуковина в каждой функции API, или есть лучше/более общий способ решения этого?

+2

Заканчивать этот вопрос: https://stackoverflow.com/questions/25547795/error-handling-in-play-framework – Mikesname

ответ

-2

Вы можете обернуть любой небезопасный результат в будущем, имея при этом Future[Result], превращая действие в async.

def myAction = Action async Future(Ok(funcRaisingException)) 
4

@Mikesname ссылка является лучшим вариантом для вашей проблемы, другое решение было бы использовать action composition и создать свое действие (в случае, если вы хотите иметь более высокий контроль над вашим действием):

def APIAction(f: Request[AnyContent] => Result): Action[AnyContent] = { 
    Action { request => 
    try { f(request) } 
    catch { case _ => InternalServerError(...) } 
    } 
} 

def index = APIAction { request => 
    ... 
} 

Или с помощью более идиоматических Scala Try:

def APIAction(f: Request[AnyContent] => Result): Action[AnyContent] = { 
    Action { request => 
    Try(f(request)) 
     .getOrElse(
     InternalServerError(Json.obj("code" -> "500", "message" -> "Server error")) 
    ) 
    } 
} 
+0

Я добавил выше код в мой 'project', но он показывает' не найден: значение APIAction' – Jamal

+0

'класса LoginWS (из: ActorRef) расширяет Актер { Защиту получить = APIAction {запроса случая json_req: JSObject => . ............. // мой код \t \t ............. вне! Json.toJson (JSObject (Seq ("login_status" -> JsString (login_status), "идентификатор_пользователя" -> JsNumber (идентификатор пользователя)))) } } ' – Jamal

Смежные вопросы