採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

finally 節

テクノロジ系 / exception (try / catch / throw / Exception / カスタム例外)

finally 節

Lesson 10 / Chapter 5

「成功しても失敗しても必ずやりたい」処理がある

<?php
$fp = fopen("data.txt", "r");
try {
    // 危ない処理 (例外で中断するかも)
    処理($fp);
} catch (Exception $e) {
    echo "失敗\n";
}
fclose($fp);   // ← catch でも閉じないといけない
  • ファイルを開いたら、成功でも失敗でも閉じたい
  • でも catch の中に fclose を書き忘れたら、リソースが残りっぱなしになる

finally で「必ず実行する」を保証

<?php
$fp = fopen("data.txt", "r");
try {
    処理($fp);
} catch (Exception $e) {
    echo "失敗\n";
} finally {
    fclose($fp);   // 成功でも失敗でも実行される
}
  • finally ブロックは try でも catch でも、必ず最後 に通る
  • 書き忘れの心配が無い

成功パターン: 例外なし

<?php
try {
    echo "try\n";
} catch (Exception $e) {
    echo "catch\n";
} finally {
    echo "finally\n";
}

実行結果:

try
finally
  • 例外が起きないと catch は通らない
  • でも finally は 必ず 通る

失敗パターン: 例外あり

<?php
try {
    echo "try\n";
    throw new Exception();
} catch (Exception $e) {
    echo "catch\n";
} finally {
    echo "finally\n";
}

実行結果:

try
catch
finally
  • 例外が出ると catch が通る
  • そして finally も 必ず 通る

このチャプターでできるようになること

finally ブロックは必ず実行される

✅ 成功 / 失敗どちらでも通る後始末を書ける

✅ ファイル close, DB disconnect, ロック解放などに使える

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

ドリル 01 — finally は必ず実行される

問題

以下の順番に出力する PHP を書いてください。

  1. try ブロックの中で "try" を出力し、その後 throw new Exception() を実行する
  2. catch (Exception $e) の中で "catch" を出力する
  3. finally ブロックの中で "finally" を出力する

期待される出力:

try
catch
finally

採点

php scripts/grade.php topics/exception/ch05-finally/drill/01-finally-always/

ヒント

  • try { echo "try\n"; throw new Exception(); }
  • catch (Exception $e) { echo "catch\n"; }
  • finally { echo "finally\n"; }