エラー処理の選択肢を増やす ~try-catchから始めて段階的に型安全へ~

1.6K Views

November 14, 25

スライド概要

profile-image

ソフトウェアエンジニア at @codmon_official Kotlinをよく書いてます。Goも好きです。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

エラー処理の選択肢を増やす ~try-catchから始めて段階的に型安全へ~ JJUG CCC 2025 Fall 上代 洋平

2.

自己紹介 上代 洋平 かじろ ようへい サーバーサイドの開発でKotlinを使ってます! 2022.12 コドモンに入社 現在 エンジニアリングマネージャー 2

3.

今日持ち帰ってほしいこと ● エラー処理の選択肢を知る ● 使い分けの判断基準を持つ 3

4.

前提 ● このセッションでは Kotlinをベースに説明します ○ コード例は主にKotlin ○ arrow-ktライブラリを使用 ○ 考え方はJavaにも適用可能 4

5.

エラー処理、こんな感じになってませんか? 5

6.

何が問題なのか? ● エラーの種類を区別できない ○ User? だけでは「なぜ失敗したか」が分からない ○ NotFoundとDBエラーを区別して処理できない 6

7.

「値で返す」という選択肢

8.

Either/Result ● エラーを「値」として返す ● 成功 or 失敗 を型で表現する 8

9.

Eitherとは 9

10.

Either 10

11.

Eitherのメリット ● エラーの種類が型で表現される ● 処理漏れがコンパイルエラーになる ● エラーが値として扱える 11

12.

エラーの種類が型で表現される 12

13.

処理漏れがコンパイルエラーになる 13

14.

エラーが値として扱える 14

15.

すべてをEitherにする必要はない

16.

全てをEitherにすると…? ● 型の複雑化 ○ 失敗しない処理にまでEitherを使う ● 無駄なエラーハンドリング ○ 丁寧に処理する必要がないエラーまでEitherにする ○ コードが複雑になるだけであまり意味がない 16

17.

全てをEitherにすると…? 17

18.

全てをEitherにすると…? 18

19.

上手く共存させる

20.

上手く共存させる ● EitherもExceptionも使う ● 適材適所で使い分けることが大事 20

21.

どう使い分ける?

22.

EitherとException の使い分け ● Either ○ 予期できるドメインエラー ○ バリデーション失敗、ビジネスルール違反 ○ 正常系の一部として設計に含める ● Exception ○ 予期しないシステムエラー ○ DB接続エラー、ネットワーク障害 22

23.

これだけだと判断が難しい

24.

レイヤードアーキテクチャだと考えやすい

25.

EitherとException の使い分け 25

26.

EitherとException の使い分け ● Domain Layer: Either(ビジネスエラー) ● Infrastructure Layer: Exception(システムエラー) ● Application Layer: Eitherの組み合わせ ● Presentation Layer: Either → HTTPレスポンス 26

27.

Domain Layer ● Either でビジネスルールを検証 ○ バリデーション ○ ビジネスロジック 27

28.

Domain Layer 28

29.

Infrastructure Layer ● Exception をそのまま投げる ○ データベースアクセス ○ 外部APIコール 29

30.

Infrastructure Layer 30

31.

Application Layer ● Either のみ処理 31

32.

Application Layer 32

33.

Presentation Layer ● 両方を適切に変換 ○ Either → HTTPレスポンス ○ Exception → ExceptionHandler 33

34.

Presentation Layer 34

35.

まとめ

36.

持ち帰ってほしいこと ● エラー処理の選択肢を知る ○ Exception ○ Either ● 使い分けの判断基準を持つ ○ 予期できるドメインエラー → Either ○ 予期しないシステムエラー → Exception ○ レイヤーごとの役割を意識する 36

37.

ご清聴ありがとうございました