概要
ファイルを開いた・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 が必ず実行されることを示す |
📝 演習: ドリル 01 — finally は必ず実行される
問題
以下の順番に出力する PHP を書いてください。
tryブロックの中で"try"を出力し、その後throw new Exception()を実行するcatch (Exception $e)の中で"catch"を出力するfinallyブロックの中で"finally"を出力する
期待される出力:
try
catch
finallyヒント
try { echo "try\n"; throw new Exception(); }catch (Exception $e) { echo "catch\n"; }finally { echo "finally\n"; }