ch05 8章中 5章目

ch05 — finally 節

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch05 — finally 節」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch05 — finally 節」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch05 — finally 節」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

ファイルを開いた・DB に繋いだ・ロックを取った――こういった 「掴んだものは離さないといけない」処理 は、例外が起きても起きなくても 必ず後始末 したい。try の最後で close、catch でも close、と書くと同じコードを 2 か所に書くことになり、漏れの温床になる。

finally ブロックは、try が正常完了しても、catch が走っても、catch すら無くて呼び出し元に例外が飛んでいく途中でも、必ず最後に 1 回実行される 特別なブロック。リソース解放を 1 か所に集約できるので、ファイル close / DB 切断 / ロック解放 / 一時ファイル削除といった 後始末コードの定位置 になる。

仕組み上のポイントは、try / catch の中に return があっても finally が return より先に実行される こと。これに引きずられて finally 内で別の return を書いてしまうと、try 側の返り値を上書きしてしまうので注意。基本姿勢は「finally では値を返さない・例外を投げない、後始末だけする」と覚えておくと事故が減る。

学習目標

  • finally ブロックは try でも catch でも、必ず最後に 実行される
  • 例外が起きても起きなくても通る後始末コードを書ける
  • ファイルクローズ・DB 切断・ロック解放などに使う

ドリル

no 内容
01 try でも catch でも finally が必ず実行されることを示す

解説スライド 全 6 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. finally 節

    Lesson 10 / Chapter 5

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

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

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

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

    実行結果:

    try
    finally
    • 例外が起きないと catch は通らない
    • でも finally は 必ず 通る
  5. 失敗パターン: 例外あり

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

    実行結果:

    try
    catch
    finally
    • 例外が出ると catch が通る
    • そして finally も 必ず 通る
  6. このチャプターでできるようになること

    finally ブロックは必ず実行される ✅ 成功 / 失敗どちらでも通る後始末を書ける ✅ ファイル close, DB disconnect, ロック解放などに使える

    → ドリルへ

1 / 6
📜 スライドを全部一気に読む(縦表示)

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, ロック解放などに使える

→ ドリルへ

この章で取り組む 演習問題の流れ (1ステップ)
  1. 01 ドリル 01 — finally は必ず実行される README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

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

問題

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

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

期待される出力:

try
catch
finally

ヒント

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

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(1問)

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

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます