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

处理来自Scala Future的wait.result异常,scala,exception,future,Scala,Exception,Future,我在Scala中有一个理解问题,我想处理wait.result的一个异常。问题是我的catch显示的是None.get,但不是我定义的异常 在案例e:exception=>BadRequest(s“exception found:${e.getMessage}”)中捕获异常,但这是一个未来。我想显示getMessage try { val futureResult = for { futureRackRow <- rackRepository.getById(rack.id)

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

案例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}")
}
试试看{
val futureResult=用于{
futureRackRow抛出RackException(s“选择机架时出错:${e.getMessage}”)
}
futureSeqGpuRow抛出GPUEException(s“从机架选择Gpu时出错:${e.getMessage}”)
}
}产量(futureRackRow、futureSeqGpuRow)
println(2)
val result=wait.result(futuresult,20秒)//异常出现在这里。。。。
结果是1场比赛{
案例部分(rackRow)=>???
案例无=>???
}
好啊
}抓住{
案例re:RackException=>BadRequest(s“Rack Exception:${re.getMessage}”)
案例ge:GpuException=>BadRequest(s“Gpu异常:${ge.getMessage}”)
案例e:Exception=>BadRequest(s“发现异常:${e.getMessage}”)
}

我假设您得到的异常是
None。get
futureRackRow
None
。然后,甚至在调用getByRack之前,它都会抛出一个调用
.id
的异常。因此,它与未来无关:)

最好在拦路之前抓住它,就像

if (futureRackRow.nonEmpty) {
  ...
}
或者,如果您有一些默认值,您可以使用它而不是.get.id

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

您发布的代码没有
选项。get
因此不清楚如何获得
None。get
Exception我无法使用isEmpty inside for{}产生并引发异常。我在wait.result之后写的所有内容都不会执行。我的异常在
rackRepository.getById(rack.id)
中,但是
抛出RackException
未执行……您如何知道异常在
rackRepository.getById(rack.id)
中?我不这么认为。您需要处理选项
futureRackRow
None
的情况,因此我打算用
.isEmpty
包装您的整个代码,或者使用默认值(如果可用)。我在末尾添加了一个NonSusElementException来解决这个问题。我仍然无法获取特定的异常,也无法在{}中使用isEmpty。这是我的实现,如果你能给我一个例子,你的想法,这将是很好的。谢谢我还想知道是否可以从我的代码中删除
wait.result(未来结果,20秒)
。。。。