处理Scala Async和Future变量的异常,在try块外访问变量名时出错

问题描述 投票:0回答:2
@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))
  }    
}

如果以声明它的方式声明它显示编译错误

json scala concurrency try-catch
2个回答
0
投票

使用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 { 
  ...
}

0
投票

我在这里有一种方法来验证传入的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)
        }
      }
    )
  }
© www.soinside.com 2019 - 2024. All rights reserved.