处理来自Scala Future的Await.result异常

时间:2018-01-05 23:38:56

标签: scala exception future

我在Scala中有一个理解,我想处理Await.result的异常。问题是我的catch显示None.get,但不是我定义的异常。

异常发生在case e: Exception => BadRequest(s"Exception found: ${e.getMessage}"),但它是未来。我想展示一下getMessage。

try {
  val futureResult = for {
    futureRackRow <- rackRepository.getById(rack.id) recoverWith {
      case e: Exception => throw RackException(s"Error on select Rack: ${e.getMessage}")
    }
    futureSeqGpuRow <- gpuRepository.getByRack(futureRackRow.get.id) recoverWith {
      case e: Exception => throw GpuException(s"Error on select Gpu's from Rack: ${e.getMessage}")
    }
  } yield (futureRackRow, futureSeqGpuRow)
  println(2)
  val result = Await.result(futureResult, 20 seconds) // The exception comes here ....

  result._1 match {
    case Some(rackRow) => ???
    case None => ???
  }
  Ok
} catch {
  case re: RackException => BadRequest(s"Rack Exception: ${re.getMessage}")
  case ge: GpuException => BadRequest(s"Gpu Exception: ${ge.getMessage}")
  case e: Exception => BadRequest(s"Exception found: ${e.getMessage}")
}

1 个答案:

答案 0 :(得分:1)

我假设您在None.get获得例外,futureRackRowNone。然后在调用getByRack之前,它会抛出一个Exception来调用.id。因此它与期货无关:)

最好在阻止之前抓住它,比如

if (futureRackRow.nonEmpty) {
  ...
}

或者如果你有一些默认值,你可以使用它而不是.get.id

 futureRackRow.map(_.id).getOrElse(0)