我真的很喜欢scala.util.Try
Scala 2.10,它与 for-comprehension 一起工作的方式使得处理多个可能很容易出错的步骤。
例如,我们可以使用下面的代码来确保仅当且仅当一切都在控制之中并且我们正确地获取值时才打印出这两个数字。
def tryA: Try[Int] = {....}
def tryB: Try[Int] = {....}
for {
a <- tryA
b <- tryB
} {
println (s"We got:${a+b}")
}
但我担心的一个问题是这段代码实际上忽略了任何异常,这意味着它看起来像下面的 try-cactch 块:
try {
// .....
} catch {
case _: Exception => // Swallow any exception
}
据我所知,有一种说法是这种代码是难闻的,因为没有人会注意到发生了异常。
我想要实现的是,仍然使用for
确保在println
一切正常的情况下唯一执行,但是如果任何步骤中有任何异常,它都会炸毁并直接抛出异常。
目前这里是我如何做到这一点,但它似乎不太优雅,因为它引入了一个新Try[Unit]
对象,所以我想知道如何才能使这段代码更好?
例如,是否可以摆脱result
变量和result.get
语句,但仍然抛出异常?
def tryA: Try[Int] = {....}
def tryB: Try[Int] = {....}
val result = for {
a <- tryA
b <- tryB
} yield {
println (s"We got:${a+b}")
}
result.get
更新
为了让事情更清楚,这是这个问题中第一个代码的 Scala REPL 的结果。
scala> def tryA: Try[Int] = Success(1)
tryA: scala.util.Try[Int]
scala> def tryB: Try[Int] = Failure(new Exception("error"))
tryB: scala.util.Try[Int]
scala> for {
| a <- tryA
| b <- tryB
| } {
| println (s"We got:${a+b}")
| }
scala>
我们可以看到这里什么都没有发生,即使tryB
是一个Failure
例外。我想得到的是抛出一个异常,并且没有引入新Try[Unit]
对象yield
,这可能吗?