ule*_*jon 4 scala playframework playframework-2.0
我正在使用play framework(2.3.x)来构建一个restful API.
今天我有一个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"))
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有必要在每个api函数中使用try/catch thingy,还是有更好/更通用的方法来解决这个问题?
@Mikesname链接是您问题的最佳选择,另一种解决方案是使用操作组合并创建您的操作(如果您希望对操作有更高的控制权):
def APIAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
Action { request =>
try { f(request) }
catch { case _ => InternalServerError(...) }
}
}
def index = APIAction { request =>
...
}
Run Code Online (Sandbox Code Playgroud)
或者使用更惯用的Scala Try:
def APIAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
Action { request =>
Try(f(request))
.getOrElse(
InternalServerError(Json.obj("code" -> "500", "message" -> "Server error"))
)
}
}
Run Code Online (Sandbox Code Playgroud)
cch*_*tep -3
您可以在将来包装任何不安全的结果,从而Future[Result]将操作转变为异步。
def myAction = Action async Future(Ok(funcRaisingException))
Run Code Online (Sandbox Code Playgroud)