はじめに
例外処理の流れを正確に理解することは、PHP8上級試験において頻出のテーマです。特に「finally
ブロックがどのタイミングで実行されるか」を明確に説明できるようになると、応用問題にも対応できるようになります。
目次
🧩 コード例
<?php
declare(strict_types=1);
error_reporting(-1);
try {
throw new Exception("any exception");
} catch (Exception $e) {
echo "Exception thrown!! \n";
echo $e->getMessage(), "\n";
} finally {
echo "fin. \n";
}
🧾 実行結果
Exception thrown!!
any exception
fin.
🧠 解説:処理の流れを理解する
PHPでは、try〜catch〜finally
の処理フローは次のように進みます。
tryブロックの中で例外発生
↓
catchブロックで例外をキャッチして処理
↓
finallyブロックを必ず実行(例外の有無に関係なく)
🪄 ASCIIアート図解で理解!
┌────────────────┐
│ tryブロック開始 │
│ ──────────────│
│ throw発生!! │──┐
└────────────────┘ │
▼
┌────────────────┐
│ catchブロック │
│ 例外を処理して │
│ メッセージ出力 │
└────────────────┘
▼
┌────────────────┐
│ finallyブロック │
│ 例外があっても │
│ 実行される! │
└────────────────┘
🧩 finallyブロックの特徴
状況 | finallyの実行有無 |
---|---|
例外が発生しない | ✅ 実行される |
例外が発生してcatchで処理された | ✅ 実行される |
catchが無くても例外発生 | ✅ finally実行後に致命的エラー |
try内でreturnがあっても | ✅ finallyは実行される |
つまり「finally
は必ず通る」と覚えておくのが試験的にも安全です。
💡 試験対策ポイント
- finallyブロックは「後処理専用」(例:ファイルクローズ、DB接続解除など)
- catchの有無に関わらず必ず実行される
- 例外が再スローされる場合でも finally は通る
- 出力順序問題が出やすいので、「try→catch→finally」の順を明確に覚えておく!
✅ まとめ
ブロック | 内容 | 実行される条件 |
---|---|---|
try | 例外が発生する可能性のある処理 | 常に実行 |
catch | 例外を捕捉して処理する | 該当する例外発生時 |
finally | 後処理(必ず通る) | 常に実行 |