#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専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿