0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

Try、Success、Failure

例外処理です。

「Try、Success、Failure」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

Try とは

Try[T] は、値を返すか例外をスローする可能性のある計算を表します。2 つのサブタイプがあります。

  • Success[T] は通常の結果をラップします。
  • Failure は Throwable をラップします。

例外をスローするコードを、合成可能な値に変換できます。

Try をインポートする

Try は scala.util にあります。例外をスローする可能性のある式を Try { ... } の中にラップすると、非致命的な例外を自動的に捕捉します。

import scala.util.Try

@main def run(): Unit = {
  val ok = Try(10 / 2)
  val bad = Try(10 / 0)
  println(ok)
  println(bad)
}

Success と Failure

正常に完了した Try は値を保持する Success になり、例外をスローしたものは例外を保持する Failure になります。

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

@main def run(): Unit = {
  val result = Try("123".toInt)
  result match {
    case Success(n) => println(s"parsed: $n")
    case Failure(e) => println(s"failed: ${e.getMessage}")
  }
}

失敗のパターンマッチング

ラップしたコードが例外をスローした場合、Failure 内の例外を調べることができます。ここでは、不正なパース結果をきれいに捕捉しています。

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

@main def run(): Unit = {
  val result = Try("abc".toInt)
  result match {
    case Success(n) => println(s"got $n")
    case Failure(e) => println(s"error type: ${e.getClass.getSimpleName}")
  }
}

Try で getOrElse を使う

getOrElse は成功値を返し、Try が失敗した場合はデフォルト値を返します。これにより、例外を完全にスローせずに済みます。

import scala.util.Try

@main def run(): Unit = {
  val n = Try("oops".toInt).getOrElse(-1)
  println(n)
}

Try に対する map

map は Success の値を変換します。元の値が Failure の場合、または変換関数が例外をスローした場合、結果は Failure のままです。

import scala.util.Try

@main def run(): Unit = {
  val doubled = Try("21".toInt).map(_ * 2)
  val failed  = Try("x".toInt).map(_ * 2)
  println(doubled)
  println(failed)
}

recover: 例外を処理する

recover を使うと、部分関数で特定の例外を処理して、Failure を Success に戻せます。

import scala.util.Try

@main def run(): Unit = {
  val safe = Try("x".toInt).recover {
    case _: NumberFormatException => 0
  }
  println(safe)
}

recoverWith

recoverWith は recover に似ていますが、ハンドラーは通常の値ではなく別の Try を返します。回復処理自体も失敗する可能性がある場合に使用します。

import scala.util.Try

@main def run(): Unit = {
  val result = Try("x".toInt).recoverWith {
    case _: NumberFormatException => Try("42".toInt)
  }
  println(result)
}

toEither と toOption

Try は、他のエラー型へ簡単に変換できます。

  • toOption: Success は Some に、Failure は None になります。
  • toEither: Success は Right に、Failure は Left(throwable) になります。
import scala.util.Try

@main def run(): Unit = {
  println(Try("5".toInt).toOption)
  println(Try("x".toInt).toOption)
  println(Try("5".toInt).toEither.isRight)
}

flatMap で連鎖させる

flatMap は、それぞれが Try を返す計算を順番に実行します。いずれかのステップが失敗すると、チェーン全体がその Failure に短絡します。

import scala.util.Try

object Main {
  def half(n: Int): Try[Int] = Try(if (n % 2 == 0) n / 2 else throw new RuntimeException("odd"))

  def main(args: Array[String]): Unit = {
    println(Try("8".toInt).flatMap(half))
    println(Try("7".toInt).flatMap(half))
  }
}

Try と try/catch の比較

Try は例外を値に変換するため、ネストした try/catch ブロックを使わずに map、flatMap、結果の結合を行えます。捕捉するのは非致命的な例外だけで、OutOfMemoryError のような重大なエラーは引き続き伝播します。

確認問題

Try についての知識を確認しましょう。

まとめ

Try による例外処理を学びました。

  • Try { ... } は非致命的な例外を Failure として、正常な結果を Success として捕捉します。
  • map/flatMap で変換し、recover/recoverWith で回復します。
  • getOrElse でデフォルト値を指定します。
  • toOption と toEither で変換します。

よくある質問

「Try、Success、Failure」レッスンは無料ですか?

はい。「Try、Success、Failure」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

「Try、Success、Failure」で何を学びますか?

例外処理です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Try、Success、Failure」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. エラーに対する Either
  2. Try、Success、Failure
  3. Either の合成
  4. 型の相互変換
← Scala for Backend Engineering & Functional Programmingに戻る