0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

Futureでのエラー処理

非同期の `Future` 計算内で例外や失敗を適切に処理するための戦略を実装します。

「Futureでのエラー処理」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全3レッスンが含まれています。

Futureの失敗を処理する

非同期処理は失敗することがあります。同期コードが例外をスローするのと同様に、Futureも成功値ではなくエラーで完了する場合があります。

このような失敗を適切に処理する方法を理解することは、堅牢な並行アプリケーションを構築するうえで重要です。適切なエラー処理がないと、プログラムがクラッシュしたり、予期しない動作をしたりする可能性があります。

Futureの結果:Try

Futureが完了すると、その結果はscala.util.Tryにラップされます。このTryは、Success(value)またはFailure(exception)のいずれかです。

  • Success:計算された値を含みます。
  • Failure:発生した例外を含みます。

onCompleteコールバックはこのTryオブジェクトを受け取るため、成功と失敗の両方を処理できます。

エラーに対してonCompleteを使う

onCompleteメソッドは、Futureの完了を監視する汎用リスナーです。Try[T]を受け取る関数を指定します。

Tryに対してパターンマッチングを行い、成功と失敗を区別できます。

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Success, Failure}

object Main {
  def main(args: Array[String]): Unit = {
    val failingFuture = Future { 
      if (true) throw new RuntimeException("Oops!")
      10
    }

    failingFuture.onComplete {
      case Success(value) => println(s"Success: $value")
      case Failure(exception) => println(s"Failure: ${exception.getMessage}")
    }

    Thread.sleep(100) // Keep JVM alive for Future to complete
  }
}

recoverメソッド

recoverを使うと、例外を処理し、Futureが失敗した場合に代替値を指定できます。Future[T]を別のFuture[T]に変換します。

元のFutureが失敗すると、指定した部分関数が例外に適用されます。パターンに一致した場合は、代替値を持つ新しい成功したFutureが返されます。

recoverの使用例

ここでは、ゼロ除算が発生すると、recoverがArithmeticExceptionを捕捉し、値0を持つFutureを返します。

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object Main {
  def main(args: Array[String]): Unit = {
    val resultFuture = Future { 10 / 0 } // This will fail

    val recoveredFuture = resultFuture.recover {
      case e: ArithmeticException =>
        println("Caught ArithmeticException, recovering...")
        0 // Fallback value
    }

    recoveredFuture.foreach(value => println(s"Result: $value"))

    Thread.sleep(100) // Keep JVM alive
  }
}

recoverWithメソッド

recoverWithはrecoverに似ていますが、代替値ではなく代替のFutureを返します。

復旧処理自体が別の非同期処理を伴う場合や、元の処理を再試行したい場合に便利です。

recoverWithの使用例

最初のFutureが失敗すると、recoverWithは別の処理やデフォルトの非同期値を試行する新しいFutureを提供します。

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object Main {
  def main(args: Array[String]): Unit = {
    val primaryOperation = Future { 
      if (true) throw new Exception("Primary failed!")
      100
    }

    val fallbackOperation = Future { 
      println("Running fallback operation...")
      50 
    }

    val finalFuture = primaryOperation.recoverWith {
      case e: Exception =>
        println(s"Primary failed: ${e.getMessage}. Using fallback.")
        fallbackOperation
    }

    finalFuture.foreach(value => println(s"Final result: $value"))

    Thread.sleep(200) // Keep JVM alive
  }
}

fallbackToメソッド

fallbackToを使うと、2つのFutureを連結できます。最初のFutureが失敗した場合、その結果は無視され、2つ目のFutureの結果が使われます。

recoverWithとは異なり、fallbackToは例外を調べません。単に「これが失敗したら、あれを試す」と指定します。

fallbackToの使用例

ここでは、failingFutureが失敗した場合、fallbackToがbackupFutureの結果を使用します。

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object Main {
  def main(args: Array[String]): Unit = {
    val failingFuture = Future { 
      if (true) throw new RuntimeException("Network error!")
      "Data from primary"
    }

    val backupFuture = Future { 
      println("Using backup source...")
      "Data from cache"
    }

    val finalResult = failingFuture.fallbackTo(backupFuture)

    finalResult.foreach(value => println(s"Retrieved: $value"))

    Thread.sleep(100) // Keep JVM alive
  }
}

エラー処理クイズ

Futureが失敗したときに、代替の非同期処理を提供したい場合、どのメソッドを使いますか。

まとめ:Futureのエラー処理

ScalaのFutureでエラーを処理するための主要な方法を見てきました。

  • onComplete:Tryを使って成功と失敗の両方に対応します。
  • recover:例外が発生した場合に代替の値を提供します。
  • recoverWith:例外が発生した場合に代替のFutureを提供します。
  • fallbackTo:エラーを調べずに、主要なFutureが失敗した場合にバックアップのFutureを使用します。

これらのメソッドは、堅牢な非同期システムを構築するうえで不可欠です。

よくある質問

「Futureでのエラー処理」レッスンは無料ですか?

はい。「Futureでのエラー処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全3レッスンが含まれています。

「Futureでのエラー処理」で何を学びますか?

非同期の `Future` 計算内で例外や失敗を適切に処理するための戦略を実装します。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「Futureでのエラー処理」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. FutureとPromiseの基礎
  2. 非同期処理の組み立て
  3. Futureでのエラー処理
← Scala for Backend Engineering & Functional Programmingに戻る