# ch01 — try / catch の基本

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

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

## 本文

# ch01 — try / catch の基本

## 概要

プログラムを書いていると、「ファイルが無い」「DB に繋がらない」「予期しない値が来た」など、**正常ルートでは処理しきれない事態** が必ず発生する。素朴に書こうとすると、関数が `false` を返したり `-1` を返したりして、呼び出し側で毎回その戻り値を if で見張る作りになる。これが何階層にも積み重なると、本来やりたい処理よりエラーチェックの方が多くなる。

PHP の **例外 (Exception)** は、この問題を「正常ルートとエラールートを別の線路に分ける」ことで解決する仕組み。`try` ブロックの中で問題が起きると、その時点で残りの処理はスキップされ、対応する `catch` ブロックに **強制的にジャンプ** する。呼び出し側の関数を何階層またいでも、途中の if 監視なしに一気に飛んでこれる。

PHP では基本となる例外型として **`Exception` クラス** が用意されていて、その下に `RuntimeException` / `InvalidArgumentException` などの標準例外がツリー状に並んでいる。この章ではまず `try { ... } catch (Exception $e) { ... }` の素朴な形を書いて、「**例外を受け止めればプログラムは落ちずに続けられる**」感覚を掴む。

## 学習目標

- `try { ... } catch (Exception $e) { ... }` の構文を書ける
- 例外が起きると `try` の残りはスキップされ、`catch` ブロックへ飛ぶ
- 例外を **受け止めれば** プログラムは落ちずに継続できる

## 所要時間

スライド 5 分 + ドリル 1 問 = **12 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | `throw new Exception` を `try / catch` で受け止める |

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 10 / Chapter 1
  目的: try / catch で例外を受け止め、プログラムが落ちないようにする
  扱わない: throw の構文 (ch02) / getMessage (ch03) / 複数 catch (ch04) / finally (ch05)
  読み上げ時間目安: 4 分半〜5 分
-->

# try / catch の基本

Lesson 10 / Chapter 1

---

## エラーが出るとプログラムは落ちる

```php
<?php
echo "前\n";
throw new Exception("問題発生");
echo "後\n";
```

実行結果:

```
前
PHP Fatal error: Uncaught Exception: 問題発生
```

- `throw` で例外が投げられた瞬間、プログラムは **停止**
- 「後」は永遠に出力されない
- 何もしないと、ユーザーに不親切な画面になる

---

## `try / catch` で例外を受け止める

```php
<?php
echo "前\n";
try {
    throw new Exception("問題発生");
} catch (Exception $e) {
    echo "受け止めた\n";
}
echo "後\n";
```

実行結果:

```
前
受け止めた
後
```

- 例外が起きても、`catch` ブロックで処理が続く
- プログラムは落ちない

---

## 「危ない処理」だけ `try` で囲む

```php
<?php
try {
    // 失敗するかもしれない処理
    危ないことをする();
} catch (Exception $e) {
    // 失敗したときの後始末
    エラー処理();
}
```

- `try` は **失敗する可能性のあるところだけ** に絞る
- 大きく囲みすぎると、どこで失敗したか分からなくなる

---

## `try` の残りはスキップされる

```php
<?php
try {
    echo "A\n";
    throw new Exception();
    echo "B\n";   // ここは絶対に実行されない
} catch (Exception $e) {
    echo "C\n";
}
echo "D\n";
```

実行結果:

```
A
C
D
```

- 例外が起きた瞬間、その後の `try` 内コードは **全部スキップ**
- 即 `catch` ブロックへジャンプ

---

## このチャプターでできるようになること

✅ `try / catch` の構文を書ける
✅ 例外が起きても catch で受け止めれば落ちない
✅ `try` で囲む範囲を絞れる
✅ 例外発生後は try の残りがスキップされると知っている

→ ドリルへ
