Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Modern Typed error handling in Kotlin ~Context ...

Modern Typed error handling in Kotlin ~Context Parametersを介したエラータイプの受け渡し~

Kolin Conf 2024で紹介されていたKolinの新しいエラーハンドリングについてのセッションを少し深堀りしてまとめた内容です

HamadaTomoki

October 20, 2024
Tweet

Other Decks in Technology

Transcript

  1. 回復可能なエラー 回復不能なエラー ユーザーに対して通知するエラー プログラマに対して通知するエラー T ソフトウェアは継続して実行されx T 問題をユーザーに報告し、処理の再試行を促a T プログラムを完全にストップさせるほど深刻ではない

    T ソフトウェアは異常終了すx T 問題をプログラマに報告し、コードの修正を促a T 不正なデータアクセスによりコードを脆弱性に晒す可能性がある 回復可能なエラーと回復不能なエラー ソフトウェアにおけるエラーは大きく2️つにわけられる 例)ファイルを開こうとして、 ファイルが存在しないために処理が失敗した 例)配列の境界を超えた箇所にアクセスしようとして処理が失敗した
  2. Exceptionで回復不能なエラー 回復不能なエラーのユースケース IQ 不正な値でユーザーを危険にさらす可能性がある場合 あと NaN マイルで undifined 会員 sr

    誰かが自分のコードを呼び出して不正な値を渡してきたら、 場合によっては、例外を投げて開発段階で修正できるように コードにバグがあることを関数の使用者に通知する 不正な値が利用され続けた結果で起きる インシデントはなんとしても避けなければならない
  3. Context Parameters と Raise DSLで回復可能なエラー 発生した例外を安全なエラータイプとして扱う 回復可能なエラー プログラムを完全にストップさせるほど深刻ではない状態であり、 発生した例外を解釈して、 アプリケーション画面などの

    インターフェースを通じてユーザーに問題を通知する アプリケーション内でのエラー表示 通常、Happy path(いわゆる正常系のこと)を 通ることを想定するが、例外が発生した場合 は安全なエラータイプ(Raise<E>)として扱う
  4. Context Parameters と Raise DSL Context Parameters 関数で使用されるコンテキストをパラメータとして、 シグネチャから分離することができるKotlinの機能 (KEEP)

    「block: T.() -> R」のような関数におけるコンテキスト「T」が、呼び出し先の関数スコープへ受け渡される ~ Note ~ Context Receiverの後継であるContext Parametersは、 まだ使用できないため実験的な機能として使えるContext Receiver を例として記述しています 関数のロジックや責務において依存はするものの必ずしもロジックの 本筋には関係ないような依存性について分離することができるため、 関数シグネチャから読み解く関数の仕様が分かりやすくなる Context Parameters と Raise DSLで回復可能なエラー
  5. Raise DSL Kotlinの新しいTyped error handling Raiseでは、関数の戻り値として「Happy path と Unhappy pathの両方に対応するためのラッパー型」を提供するEither

    とは異なり、関数の戻り値には「Happy path の型のみ」を指定する Context Parameters と Raise DSL Context Parameters と Raise DSLで回復可能なエラー New !
  6. ROP (Railway Oriented Programming) ROP (Railway Oriented Programming) 2014年にScott Wlaschinによって提唱された関数型プログラミングを行う中で

    「エラーハンドリングをどう扱っていくか」に焦点を当てたプログラミング手法 ROPでは、エラーハンドリングを鉄道 (Railway)の車線に例える 関数の入力 (Input)に対して、「Happy path (正常系- Success) 」と「Unhappy path (異常系 - Failure)」の2つの異なる出力を得られる このような分岐を生じる関数を「Switch function (スイッチ関数)」と呼ぶ Input Failure Success Context Parameters と Raise DSLで回復可能なエラー
  7. ROP (Railway Oriented Programming) Context Parameters と Raise DSLで回復可能なエラー なお、一度

    Unhappy path に入ってしまうと、 基本的に「Happy pathに は決して戻さない」 スイッチ関数はコールスタックを積むことで、 2路線の鉄道を延長できる という点に注意!
  8. エラータイプのレイヤリング Layered Architectureにおけるエラータイプのレイヤリング P Use-casV P Domain ServicV P Validation

    ... etc P Ui State P Repositorh P Networf P Database ... etc raise raise UI Layer Domain Layer Data Layer Context Parametersを介したRaise DSL`context(Raise<E>)` により、 エラータイプを上位層に伝え、最後は Ui State に変換する
  9. 参考 t Kotlin Conf2024 - Unlocking the Power of Arrow

    2.0: A Comprehensive GuidU t Kotlin KEEP - Context Parameterd t F# for Fun and Profit - Railway Oriented Programminh t ArrowKt - Working with typed errord t Scala 3 Reference - Using Clauses