エラーと依存性のチャネル
型付きエラーと環境です。
「エラーと依存性のチャネル」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
強力な2つのチャネル
成功値に加えて、ZIO[R, E, A]は型付きエラーチャネルEと依存関係チャネルRを追跡します。どちらも型に現れるため、失敗と必要な依存関係がコンパイル時に明示されます。
型付きエラー
ドメイン上の失敗をsealedな階層としてモデル化し、それをEに指定します。するとコンパイラーが、該当するケースをすべて処理するよう強制します。
import zio._
sealed trait AppError
case object NotFound extends AppError
case object Forbidden extends AppError
val lookup: IO[AppError, String] = ZIO.fail(NotFound)catchAllによるリカバリー
catchAllは新しいエフェクトを提供することで、Eに含まれるすべてのエラーを処理します。すべて処理した後は、エラーチャネルをNothingにできます。
import zio._
val safe: UIO[String] =
ZIO.fail("boom").catchAll(e => ZIO.succeed(s"recovered: $e"))catchSomeとorElse
catchSomeは一致するエラーだけを回復します。orElseは、失敗した場合に別のエフェクトへフォールバックします。
import zio._
val prog = ZIO.fail("x").orElse(ZIO.succeed("fallback"))Eitherとfold
eitherはZIO[R, E, A]をZIO[R, Nothing, Either[E, A]]に変換します。foldはエラーと成功の両方を処理し、1つの値にまとめます。
import zio._
val label: UIO[String] =
ZIO.fail(404).fold(e => s"err $e", v => s"ok $v")DefectとFailureの違い
ZIOでは、failure(型付きで予期される失敗で、Eに含まれる)と、defect(予期しないthrowable)を区別します。ZIO.dieはdefectを発生させます。defectはE型には含まれず、バグを表します。
環境R
Rチャネルは、エフェクトが必要とするサービスを宣言します。ZIO.serviceでサービスにアクセスでき、依存関係が提供されるまで、その要件はRに現れます。
import zio._
trait Logger { def log(s: String): UIO[Unit] }
val prog: ZIO[Logger, Nothing, Unit] =
ZIO.serviceWithZIO[Logger](_.log("hello"))サービスの定義
サービスはtraitと、それを構築するZLayerで構成されます。Layerは依存関係の構築方法を記述し、それ自体が他のLayerに依存することもできます。
import zio._
case class ConsoleLogger() extends Logger {
def log(s: String): UIO[Unit] = ZIO.succeed(println(s))
}
object ConsoleLogger {
val layer: ULayer[Logger] = ZLayer.succeed(ConsoleLogger())
}
trait Logger { def log(s: String): UIO[Unit] }依存関係の提供
provide(またはprovideLayer)はRの要件を満たし、ZIO[Logger, E, A]を実行可能なZIO[Any, E, A]に変換します。
import zio._
val runnable: UIO[Unit] =
ZIO.serviceWithZIO[Logger](_.log("hi"))
.provide(ConsoleLogger.layer)
trait Logger { def log(s: String): UIO[Unit] }
object ConsoleLogger { val layer: ULayer[Logger] = ??? }Layerの合成
Layerは++(結合)で水平方向に、>>>(一方のLayerの出力を別のLayerの入力として渡す)で垂直方向に合成し、完全な依存関係グラフを構築できます。
import zio._
// val appLayer = configLayer ++ (dbLayer >>> repoLayer)通常のScalaによる基準実装
比較のため、手動でエラー処理を行う自己完結型のScalaプログラムを示します。ZIOは同じエラーを型に組み込み、Layerを通じて依存関係を注入します。
object Main {
def main(args: Array[String]): Unit = {
val result: Either[String, Int] = Left("NotFound")
val msg = result.fold(e => s"err $e", v => s"ok $v")
println(msg)
}
}クイックチェック
provideメソッドはZIO[Logger, E, A]に対して何を行いますか?
まとめ
次の2つの追加チャネルを扱いました。
- エラー:型付きの
E、catchAll、orElse、fold、defectとfailureの違い - 依存関係:
R、サービス、ZLayer、provide、Layerの合成
次は、ZIOアプリケーションの実行です。
よくある質問
「エラーと依存性のチャネル」レッスンは無料ですか?
はい。「エラーと依存性のチャネル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「エラーと依存性のチャネル」で何を学びますか?
型付きエラーと環境です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「エラーと依存性のチャネル」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ZIO エフェクト
- ZIO の合成
- エラーと依存性のチャネル
- ZIO アプリの実行