2014-08-29 71 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