我有一个运行一些代码的控制器,我在try / catch中包含一些代码,希望在catch期间打破控制器运行并返回错误。
它不会返回,如何根据需要将我的响应包装在动作函数中?
示例:
def updateProduct(productId:String,lang: String, t: String) = Action {
request =>
request.body.asJson.map {
json =>
var product:Product=null
try
{
product = json.as[Product]
}
catch
{
case ex: Exception => {
val errorResponse:ErrorResponse[String] = ErrorResponse(ErrorCode.InvalidParameters, ex.getMessage, 500)
return InternalServerError(Json.toJson(errorResponse)) //Does not stop,
}
}
val response = productService.updateProduct(UpdateProductRequest(lang,t,productId,product))
if (response.isError)
{
InternalServerError(Json.toJson(response))
}
else
{
Ok(Json.toJson(response))
}}.getOrElse {
Logger.warn("Bad json:" + request.body.asText.getOrElse("No data in body"))
var errorResponse:ErrorResponse[String] = ErrorResponse(ErrorCode.GeneralError, "Error processing request", 500)
errorResponse.addMessage("No data in body")
Ok(Json.toJson(errorResponse))
}
}
我收到错误:
method updateProduct has return statement; needs result type
答案 0 :(得分:3)
当您使用return
时,您必须使用显式返回类型。 Scala不会为你推断它。
所以,例如:
def fails(i: Int) = return (i+1) // Doesn't compile
def works(i: Int): Int = return (i+1) // Does
我不确定Ok
和InternalServerError
的常见超类型是什么,但那将是你所追求的。如果它是一种无用的类型,例如AnyRef
(即Object
),使用Either
或等效类型可能是一个好主意(即Left(InternalServerError/*...*/)
,{{1} })。