# ch05 — finally 節

Source: https://php-school.pages.dev/topics/exception/ch05-finally/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 例外処理
Level: L3

Reference (official): https://www.php.net/manual/ja/language.exceptions.php

## 本文

# ch05 — finally 節

## 概要

ファイルを開いた・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 切断・ロック解放などに使う

## 所要時間

スライド 4 分 + ドリル 1 問 = **10 分**

## ドリル

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

## スライド

---
marp: true
theme: dojo
paginate: true
size: 16:9
---

<!--
LLM_CONTEXT:
  Lesson 10 / Chapter 5
  目的: finally 節で「成功しても失敗しても通る後始末」を書く
  扱わない: カスタム例外 (ch06) / rethrow (ch07) / return との相互作用は高度
  読み上げ時間目安: 3 分半〜4 分
-->

# finally 節

Lesson 10 / Chapter 5

---

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

```php
<?php
$fp = fopen("data.txt", "r");
try {
    // 危ない処理 (例外で中断するかも)
    処理($fp);
} catch (Exception $e) {
    echo "失敗\n";
}
fclose($fp);   // ← catch でも閉じないといけない
```

- ファイルを開いたら、成功でも失敗でも閉じたい
- でも catch の中に `fclose` を書き忘れたら、リソースが残りっぱなしになる

---

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

```php
<?php
$fp = fopen("data.txt", "r");
try {
    処理($fp);
} catch (Exception $e) {
    echo "失敗\n";
} finally {
    fclose($fp);   // 成功でも失敗でも実行される
}
```

- `finally` ブロックは **try でも catch でも、必ず最後** に通る
- 書き忘れの心配が無い

---

## 成功パターン: 例外なし

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

実行結果:

```
try
finally
```

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

---

## 失敗パターン: 例外あり

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

→ ドリルへ
