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 を書いてください。
tryブロックの中で"try"を出力し、その後throw new Exception()を実行するcatch (Exception $e)の中で"catch"を出力する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"; }