我在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}")
}
答案 0 :(得分:1)
我假设您在None.get
获得例外,futureRackRow
是None
。然后在调用getByRack之前,它会抛出一个Exception来调用.id
。因此它与期货无关:)
最好在阻止之前抓住它,比如
if (futureRackRow.nonEmpty) {
...
}
或者如果你有一些默认值,你可以使用它而不是.get.id
futureRackRow.map(_.id).getOrElse(0)