处理来自Scala Future的wait.result异常
我在Scala中有一个理解问题,我想处理wait.result的一个异常。问题是我的catch显示的是处理来自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)
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秒)
。。。。