处理Scala Async和Future变量的异常,在try块外访问变量名时出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理Scala Async和Future变量的异常,在try块外访问变量名时出错相关的知识,希望对你有一定的参考价值。
@scala.throws[scala.Exception]
def processQuery(searchQuery : scala.Predef.String) : scala.concurrent.Future[io.circe.Json] = { /* compiled code */ }
如何在第3行声明searchResult
变量,以便它可以在try
块内初始化,并且如果它在try
块之后和之外成功,则可以进行处理。或者,还有其他方法来处理异常吗?包含processQuery
函数的文件对我来说是不可编辑的,它是只读的。
def index = Action.async{ implicit request =>
val query = request.body.asText.get
var searchResult : scala.concurrent.Future[io.circe.Json] = Future[io.circe.Json] //line 3
var jsonVal = ""
try {
searchResult = search.processQuery(query)
} catch {
case e :Throwable => jsonVal = e.getMessage
}
searchResult onSuccess ({
case result => jsonVal = result.toString()
})
searchResult.map{ result =>
Ok(Json.parse(jsonVal))
}
}
如果以声明它的方式声明它显示编译错误
答案
使用recover
方法会帮助你吗?我还建议避免使用var
并尽可能使用更具功能性的方法。在我的世界(并播放Json库)中,我希望得到类似的东西:
def index = Action.async { implicit request =>
processQuery(request.body.asText.get).map { json =>
Ok(Json.obj("success" -> true, "result" -> json))
}.recover {
case e: Throwable => Ok(Json.obj("success" -> false, "message" -> e.getMessage))
}
}
我想可能有必要将代码放在另一个完整的try
catch
:
try {
processQuery....
...
} catch {
...
}
另一答案
我在这里有一种方法来验证传入的JSON并折叠验证结果:
def returnToNormalPowerPlant(id: Int) = Action.async(parse.tolerantJson) { request =>
request.body.validate[ReturnToNormalCommand].fold(
errors => {
Future.successful{
BadRequest(
Json.obj("status" -> "error", "message" -> JsError.toJson(errors))
)
}
},
returnToNormalCommand => {
actorFor(id) flatMap {
case None =>
Future.successful {
NotFound(s"HTTP 404 :: PowerPlant with ID $id not found")
}
case Some(actorRef) =>
sendCommand(actorRef, id, returnToNormalCommand)
}
}
)
}
以上是关于处理Scala Async和Future变量的异常,在try块外访问变量名时出错的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot技术专题「Async&Future」异步编程机制以及功能分析讲解
FlutterFuture 异步编程 ( 简介 | then 方法 | 异常捕获 | asyncawait 关键字 | whenComplete 方法 | timeout 方法 )