#11 Scalaで学ぶエラーハンドリングの基本

Scalaのエラーハンドリングには、Javaと同じtry・catchに加えて、関数型プログラミングらしいTryという型を使った考え方があります。この記事では、Scalaにおけるエラーハンドリングの基本と、関数型らしい書き方を解説します。

try・catchの基本

try {
    val result = 10 / 0
} catch {
    case e: ArithmeticException => println("0では割れません")
}

catchの中で、以前の記事で触れたmatchと同じ書き方をするのがScalaの特徴です。

Tryという型を使う方法

Scalaには、RustのResultに似たTryという型があり、成功(Success)と失敗(Failure)を値として扱えます。

import scala.util.{Try, Success, Failure}

val result: Try[Int] = Try(10 / 0)
result match {
    case Success(value) => println(s"結果: $value")
    case Failure(e) => println("エラーが発生しました")
}

Tryをメソッドチェーンで扱う

TryはOptionと同じように、mapやgetOrElseと組み合わせて扱えます。

val result = Try(10 / 2).map(_ * 100).getOrElse(0)
println(result) // 500

失敗した場合はmapの中身が実行されず、getOrElseで指定した既定値がそのまま使われます。try・catchで分岐を書くより、値の流れとしてエラー処理を表現できるのが関数型らしい特徴です。

Eitherでエラー内容も表現する

Tryは成功・失敗しか表現できませんが、失敗の理由を独自の型で表現したい場合はEitherもよく使われます。

def divide(a: Int, b: Int): Either[String, Int] =
    if (b == 0) Left("0では割れません") else Right(a / b)

divide(10, 0) match {
    case Right(value) => println(s"結果: $value")
    case Left(message) => println(s"エラー: $message")
}

慣習として、失敗はLeft、成功はRightに入れます。

Scalaならではの注意点

try・catchは他の言語と似た書き方ができますが、Scalaらしいコードを書きたい場合は、Try型を使ってエラーを「値」として扱う書き方に慣れていくとよいでしょう。値として扱えることで、他の処理と組み合わせやすくなります。

まとめ

Scalaのエラーハンドリングはtry・catchに加えて、Try型を使う関数型らしい方法があります。map・getOrElseとの組み合わせも含め、両方の書き方を知っておくと、状況に応じて選べます。


本ページはプロモーションを含みます。

参考書籍(PR)

Scalaをもっと学びたい方には「実践Scala入門」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本