Help us understand the problem. What is going on with this article?

ScalaでFutureの処理結果をEither型に格納してみる

概要

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)
  }
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away