Scala 2.10ではscala.util.Try
が本当に好きですが、for-comprehensionでどのように動作して複数のステップを処理しやすくなります。scala.util.Tryとの補完を使用するとすぐにエラーが発生する
たとえば、次のコードを使用して、すべてが制御され、正しく値が取得された場合にのみ、2つの数値を出力することができます。
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
を使用して、すべてがOKであれば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
と導入しないと、これは可能ですか?
'println'の型が' Unit'なので、 'result'は例外を投げたり、' Unit'値 '()'を返します。 –
いいえ、 'get'メソッドを使用しない限り例外をスローしません。 –
サンプルコードに無条件の 'result.get'が含まれています。 (私は最初のコメントに 'result.get'を書くことを意味しました...) –