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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- FutureとPromiseの基礎
- 非同期処理の組み立て
- Futureでのエラー処理