2014-08-29 197 views
3

我正在使用play framework(2.3.x)构建一个restful API。在Play框架中处理异常

今天我有一个try/catch块围绕API控制器中的所有API函数,以便能够捕获异常并返回一个通用的“错误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函数在try/catch啄,还是有解决的更好/更通用的方法?

+2

退房这个问题:https://stackoverflow.com/questions/25547795/error-handling-in-play-framework – Mikesname 2014-08-29 19:30:33

回答

-2

您可以在未来包装任何不安全的结果,因此将动作转换为异步。

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 => 
    ... 
} 

或者用更地道斯卡拉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'中,但是它显示'not found:value APIAction' – Jamal 2015-10-07 09:06:47

+0

'class LoginWS(out:ActorRef)extends Actor { def receive = APIAction {request case json_req:JsObject => 。 ............. //我的代码 \t \t ............. out! Json.toJson(JsObject(Seq(“login_status” - > JsString(login_status),“user_id” - > JsNumber(userID)))) } }'' – Jamal 2015-10-07 09:09:05