try-catch-finally構文

Scalaの例外処理におけるtry-catch-finally構文は、Javaと似ていますが、Scalaの特徴を活かした柔軟な構文となっています。この構文は、例外が発生する可能性のあるコードを安全に実行し、必要に応じて例外を捕捉・処理し、最終的な後処理を行うために使用されます。


1. 構文の基本

scala
try { // 例外が発生する可能性のあるコード } catch { case e1: ExceptionType1 => // e1に対する処理 case e2: ExceptionType2 => // e2に対する処理 } finally { // 最終的に必ず実行されるコード(例:リソースの解放) }

2. 各構成要素の説明

tryブロック

  • 例外が発生する可能性のあるコードを記述します。

  • 例外が発生しなければ、catchブロックやfinallyブロックには進みません(finallyは除く)。

catchブロック

  • Javaと異なり、複数のcase文によるパターンマッチングを使って、例外の型に応じた処理を記述します。

  • case e: ExceptionType => の形式で個別の例外に対する処理を記述します。

finallyブロック

  • 例外の発生有無にかかわらず必ず実行される処理を記述します。

  • 通常はリソースの解放やログ出力などに用いられます。


3. 具体例

scala
def divide(a: Int, b: Int): Int = { try { a / b } catch { case e: ArithmeticException => println("0で割ろうとしました") 0 } finally { println("終了処理を実行します") } }

実行例

scala
divide(10, 2) // 出力: // 終了処理を実行します // 戻り値: 5 divide(10, 0) // 出力: // 0で割ろうとしました // 終了処理を実行します // 戻り値: 0

4. 注意点

  • finallyブロック内でreturnを使うと、trycatchの戻り値を上書きしてしまうため、推奨されません。

  • Scalaでは副作用の少ない関数型スタイルが推奨されるため、Tryなどの代替手段(scala.util.Try)も利用されます(純粋関数型風のエラーハンドリング)。


5. まとめ

ブロック 目的
try 例外が発生する可能性のある処理
catch 例外の種類に応じた処理
finally 常に実行されるクリーンアップ処理

Scalaのtry-catch-finally構文は、命令型言語に慣れている開発者にも直感的に理解しやすく、かつScala独自のパターンマッチ構文を活かした柔軟な例外処理が可能です。

生成日:2025/05/04