处理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块外访问变量名时出错的主要内容,如果未能解决你的问题,请参考以下文章

scala scala 条件控制 和异常处理

Scala 学习笔记之集合 Try和Future

SpringBoot技术专题「Async&Future」异步编程机制以及功能分析讲解

FlutterFuture 异步编程 ( 简介 | then 方法 | 异常捕获 | asyncawait 关键字 | whenComplete 方法 | timeout 方法 )

映射失败的 Future 的异常

Scala:在没有任何特定条件的情况下处理Future.Filter.exists的更好方法