概要
Scalaの便利な機能として、「Future」を使って、http通信などの非同期処理が簡単にかけることが挙げられます。
Futureですが内部処理でExceptionが発生した場合、どうハンドリングをすべきかという点を意識する必要があります。【Scala】Future と未来のセカイの記事にもある通り、通常と異常で取得する値の型が異なるわけです。
例えばFutureの結果を次処理でそのまま使いたい場合、使えるのがEither型だろうということで今回はFutureの結果をEither型で格納するサンプルを作成してみました。
サンプルコード
例外が発生した場合、recoverメソッドを使ってEitherのLeftに値を設定するようにします。なお、recoverについては[Scala] Future#recoverを使って例外処理するにて解説されています。
以下のコードは与えられた値が1だったら2倍してRightに設定し、それ以外だったらエラーメッセージをLeftに設定します。
FutureTest.scala
def testRecover(param: Int) = {
val sample1 = Future {
if (param == 1) { 1 } else { throw new IllegalArgumentException("error!")}
}
val test = Await.result(
sample1.map{f => Right(f * 2)}
recover {case e: IllegalArgumentException => Left(e.getMessage)}
, 1 minute)
println(test)
}