Option、Either、Tryの使用

Scalaでは、例外処理に従来のtry-catch構文の他に、関数型プログラミングのスタイルに基づいた安全なエラー処理を行うために、OptionEitherTry という3つの重要な抽象型が提供されています。これらは例外の代わりに値を通じてエラーを伝達することを可能にし、より明示的で副作用の少ないコードを書くことができます。それぞれの特徴と使用例を以下に詳しく説明します。


1. Option

説明:

Option[A]は、「値が存在する (Some[A])」または「存在しない (None)」という2つの可能性を表すコンテナです。nullの代替としてよく使われ、存在しないことを安全に扱うことができます。

シグネチャ:

scala
sealed abstract class Option[+A] case class Some[A](value: A) extends Option[A] case object None extends Option[Nothing]

使用例:

scala
def findUser(id: Int): Option[String] = { if (id == 1) Some("Alice") else None } val user = findUser(2) val name = user.getOrElse("Unknown") // => "Unknown"

メリット:

  • nullを使わずに値の有無を扱える

  • パターンマッチや高階関数(map, flatMap)との相性が良い


2. Either

説明:

Either[A, B]は、2つのいずれかの型の値を保持できます。慣習的に、Leftがエラー、Rightが成功を意味します。より詳細なエラーメッセージや型を持たせたいときに有効です。

シグネチャ:

scala
sealed abstract class Either[+A, +B] case class Left[A](value: A) extends Either[A, Nothing] case class Right[B](value: B) extends Either[Nothing, B]

使用例:

scala
def divide(a: Int, b: Int): Either[String, Int] = { if (b == 0) Left("Division by zero") else Right(a / b) } divide(10, 2) match { case Right(result) => println(s"Result: $result") case Left(error) => println(s"Error: $error") }

メリット:

  • 成功/失敗のいずれかを明示的に扱える

  • エラー型に情報を保持可能


3. Try

説明:

Try[A]は、例外が発生する可能性のある処理を安全にラップするためのコンテナです。成功時にはSuccess[A]、失敗時にはFailure[Throwable]を返します。

シグネチャ:

scala
sealed abstract class Try[+A] case class Success[A](value: A) extends Try[A] case class Failure[A](exception: Throwable) extends Try[A]

使用例:

scala
import scala.util.{Try, Success, Failure} def parseInt(str: String): Try[Int] = Try(str.toInt) parseInt("123") match { case Success(value) => println(s"Parsed: $value") case Failure(e) => println(s"Failed with exception: ${e.getMessage}") }

メリット:

  • try-catch構文よりも関数型スタイルに合っている

  • map/flatMapによる合成が可能

  • recovergetOrElseなど豊富なユーティリティを提供


比較と選択基準

特性 Option Either Try
主な目的 値の存在/不存在 成功/失敗とエラー情報の保持 例外をキャッチして扱う
エラー情報 なし (Noneのみ) 任意の型 (Left) 例外 (Throwable) に限定
使用場面 nullの代替 バリデーション・業務ロジック 実行時例外の安全な処理

結論

Scalaでは、例外処理をより明示的かつ関数型スタイルで記述するために、OptionEitherTryが重要な役割を果たします。

  • Optionは値が「存在するかどうか」に着目する場合、

  • Eitherはエラー理由を含めて成功・失敗を表現したい場合、

  • Tryは例外を伴う処理を関数型で記述したい場合、

にそれぞれ使い分けると、堅牢で読みやすいコードが書けます。

生成日:2025/05/04