IO のエラー処理
handleError です。
「IO のエラー処理」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
値としてのエラー
Cats Effectでは、IOは失敗する可能性があります。失敗は値の一部なので、構造化されていないtry/catchを使わずに調査し、復旧できます。
エラーの発生
IO.raiseErrorを使うと、指定した例外によって失敗するIOを明示的に作成できます。
import cats.effect.IO
val failed: IO[Int] =
IO.raiseError(new RuntimeException("boom"))handleError
handleErrorは、エラーから計算したフォールバック値を提供して、失敗したIOから復旧します。その時点では失敗しないIOが結果になります。
import cats.effect.IO
val safe: IO[Int] =
IO.raiseError[Int](new RuntimeException("x"))
.handleError(_ => -1)handleErrorWith
handleErrorWithは別のIOを使って復旧するため、フォールバック自体にエフェクトを持たせられます(ログ出力、再試行、デフォルト値の返却など)。
import cats.effect.IO
val recovered: IO[Int] =
IO(throw new RuntimeException("fail"))
.handleErrorWith(e => IO.println(s"caught: ${e.getMessage}").as(0))attempt
attemptはIO[A]をIO[Either[Throwable, A]]に変換し、エラーを値として具体化します。これにより、パターンマッチングで処理できます。
import cats.effect.IO
val e: IO[Either[Throwable, Int]] =
IO.raiseError[Int](new RuntimeException("oops")).attemptattemptのパターンマッチング
attemptの後は、Eitherに対する通常のflatMapで成功と失敗を分岐できます。
import cats.effect.IO
val prog: IO[Unit] = IO(10 / 2).attempt.flatMap {
case Right(v) => IO.println(s"ok: $v")
case Left(e) => IO.println(s"err: ${e.getMessage}")
}redeem
redeemは1回の呼び出しで両方の分岐を処理します。エラー用と成功用にそれぞれ1つの関数を指定し、どちらも通常の値を返します。
import cats.effect.IO
val label: IO[String] =
IO(42).redeem(e => s"failed: $e", v => s"value: $v")redeemWith
redeemWithはredeemと似ていますが、各分岐がIOを返すため、成功と失敗の両方をエフェクト付きで処理できます。
import cats.effect.IO
val prog: IO[Unit] = IO(42).redeemWith(
e => IO.println(s"err: $e"),
v => IO.println(s"got: $v")
)guaranteeによる後処理
guaranteeは、エフェクトが成功しても失敗しても最後に実行する処理を実行します。リソースの解放や完了ログの記録に最適です。
import cats.effect.IO
val prog: IO[Int] =
IO(compute()).guarantee(IO.println("done"))
def compute(): Int = 7失敗時の再試行
handleErrorWithで再帰的に復旧し、カウンターが0になるまで減らすことで、単純な再試行を構築できます。
import cats.effect.IO
def retry[A](io: IO[A], n: Int): IO[A] =
if (n <= 0) io
else io.handleErrorWith(_ => retry(io, n - 1))通常のScalaのtry/catch
通常のScalaで行う、従来の即時評価されるエラー処理と比較してみましょう。IOのコンビネーターは、同じ安全性を、合成可能で純粋な値として提供します。
object Main {
def main(args: Array[String]): Unit = {
val result = try { 10 / 0 } catch { case _: ArithmeticException => -1 }
println(s"result: $result")
}
}クイックチェック
IO[A]をIO[Either[Throwable, A]]に変換するメソッドはどれですか?
まとめ
IOでは次の機能を使ってエラーを処理しました。
- 明示的な失敗には
raiseError - 復旧には
handleError/handleErrorWith Eitherの具体化にはattempt- 両方の分岐の処理には
redeem/redeemWith - 後処理には
guarantee
CatsとIOのコースはこれで完了です。
よくある質問
「IO のエラー処理」レッスンは無料ですか?
はい。「IO のエラー処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「IO のエラー処理」で何を学びますか?
handleError です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「IO のエラー処理」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Cats の型クラス
- IO モナド
- IO の合成
- IO のエラー処理