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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- エラーに対する Either
- Try、Success、Failure
- Either の合成
- 型の相互変換