私は Scala 2.10 をとても気に入っscala.util.Try
ています。それが for-comprehension とどのように機能するかにより、簡単に失敗する可能性のある複数のステップを処理できます。
たとえば、次のコードを使用して、すべてが制御下にあり、値が正しく取得された場合にのみ、その 2 つの数値のみを出力するようにすることができます。
def tryA: Try[Int] = {....}
def tryB: Try[Int] = {....}
for {
a <- tryA
b <- tryB
} {
println (s"We got:${a+b}")
}
しかし、私の懸念の 1 つは、このコードが実際にはすべての例外を無視していることです。つまり、次の 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
with 例外であっても何も起こらないことがわかります。私が取得したいのは、例外がスローされることです.新しいTry[Unit]
オブジェクトを導入することなく、yield
これは可能ですか?