Scalaでは、例外処理に従来のtry-catch構文の他に、関数型プログラミングのスタイルに基づいた安全なエラー処理を行うために、Option、Either、Try という3つの重要な抽象型が提供されています。これらは例外の代わりに値を通じてエラーを伝達することを可能にし、より明示的で副作用の少ないコードを書くことができます。それぞれの特徴と使用例を以下に詳しく説明します。
1. Option
Option
説明:
Option[A]は、「値が存在する (Some[A])」または「存在しない (None)」という2つの可能性を表すコンテナです。nullの代替としてよく使われ、存在しないことを安全に扱うことができます。
シグネチャ:
使用例:
メリット:
-
nullを使わずに値の有無を扱える
-
パターンマッチや高階関数(map, flatMap)との相性が良い
2. Either
Either
説明:
Either[A, B]は、2つのいずれかの型の値を保持できます。慣習的に、Leftがエラー、Rightが成功を意味します。より詳細なエラーメッセージや型を持たせたいときに有効です。
シグネチャ:
使用例:
メリット:
-
成功/失敗のいずれかを明示的に扱える
-
エラー型に情報を保持可能
3. Try
Try
説明:
Try[A]は、例外が発生する可能性のある処理を安全にラップするためのコンテナです。成功時にはSuccess[A]、失敗時にはFailure[Throwable]を返します。
シグネチャ:
使用例:
メリット:
-
try-catch構文よりも関数型スタイルに合っている -
map/flatMapによる合成が可能
-
recoverやgetOrElseなど豊富なユーティリティを提供
比較と選択基準
| 特性 | Option | Either | Try |
|---|---|---|---|
| 主な目的 | 値の存在/不存在 | 成功/失敗とエラー情報の保持 | 例外をキャッチして扱う |
| エラー情報 | なし (Noneのみ) |
任意の型 (Left) |
例外 (Throwable) に限定 |
| 使用場面 | nullの代替 | バリデーション・業務ロジック | 実行時例外の安全な処理 |
結論
Scalaでは、例外処理をより明示的かつ関数型スタイルで記述するために、Option、Either、Tryが重要な役割を果たします。
-
Optionは値が「存在するかどうか」に着目する場合、 -
Eitherはエラー理由を含めて成功・失敗を表現したい場合、 -
Tryは例外を伴う処理を関数型で記述したい場合、
にそれぞれ使い分けると、堅牢で読みやすいコードが書けます。
生成日:2025/05/04