【Scala】Scala ~ 基本編 / 例外処理 ~

■ はじめに

Scala の 例外処理について扱う。
基本、Javaに近いが、Scala特有の機能もある。

目次

【1】try / catch / finally
【2】例外クラス定義
【3】Option / Either / Try
 1)Try

【1】try / catch / finally

* Javaと比較して、catch が若干違うだけで
 他は同じように書ける

サンプル

object  Hello {
  def main(args: Array[String]): Unit = {
    try {
      val result = 1 / 0
    } catch {
      // catch は若干違う (rethrowは同じ)
      case e: Exception => throw e
    } finally {
      // finally も Javaと同じ
      println("Done!")
    }
  }
}

【2】例外クラス定義

object DemoExceptions {
  class Demo1Exception extends RuntimeException
  class Demo2Exception extends RuntimeException
}

【3】Option / Either / Try

* Option / Either については、以下の関連記事を参照のこと

Scala ~ 基本編 / Option型 ~
https://dk521123.hatenablog.com/entry/2023/03/09/000000
Scala ~ 基本編 / Either型 ~
https://dk521123.hatenablog.com/entry/2023/08/02/132315

1)Try

// Tryを使うには、import が必要
import scala.util.Try

object DemoExceptions {
  class DemoException extends RuntimeException
}

object Utils {
  import DemoExceptions._

  def sum(a: Int, b: Int): Int = {
    if (a < 0 || b < 0) {
      throw new DemoException
    }
    a + b
  }
}

object  Hello {
  import DemoExceptions._

  private def demoTry(valueA: Int, valueB: Int): Try[Int] = Try {
    Utils.sum(valueA, valueB)
  }

  def main(args: Array[String]): Unit = {
    try {
      val result1 = demoTry(1, 1)
      println(result1)
      println(result1.getOrElse(-1))
      val result2 = demoTry(1, -1)
      println(result2)
      println(result2.getOrElse(-1))
    } catch {
      case e: DemoException => throw e
    } finally {
      println("Done!")
    }
  }
}

出力結果

Success(2)
2
Failure(DemoExceptions$DemoException) // 補足参照
-1
Done!

補足

catchで rethrowしている作りだが、
そもそも例外にならずに catchに来ていない

参考文献

https://qiita.com/takayahilton/items/63f00762116b6d6c7f98
https://www.baeldung.com/scala/exception-handling

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / Either型 ~
https://dk521123.hatenablog.com/entry/2023/08/02/132315
Scala ~ 基本編 / Option型 ~
https://dk521123.hatenablog.com/entry/2023/03/09/000000