# ch03 — Exception::getMessage()

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

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

## 本文

# ch03 — Exception::getMessage()

## 概要

例外を `catch` で受け止めたあと、「何が起きたか」を知らないとログにも画面にも出せない。`catch (Exception $e)` の `$e` には、投げられた例外オブジェクトそのものが入っていて、ここからメッセージ・発生ファイル・行番号・スタックトレースを取り出せる。

最もよく使うのが **`$e->getMessage()`**。これは `throw new Exception("...")` で渡した文字列をそのまま返すメソッドで、ログ出力やユーザー向けメッセージ生成に使う。あわせて `$e->getFile()` で発生ファイル、`$e->getLine()` で行番号、`$e->getTrace()` / `$e->getTraceAsString()` で呼び出し履歴も取れる。デバッグでは行番号付きで吐く、本番ログでは詳細を残しつつユーザー画面には汎用メッセージだけ出す、という使い分けが定石。

注意したいのは、`getMessage()` の中身は **`throw` した側が決めた文字列** だということ。投げる側が良いメッセージを書かないと、catch 側で頑張ってもユーザーには伝わらない。「何が・どうダメか」が後から読んで分かるメッセージを書く習慣が、結局例外活用の質を決める。

## 学習目標

- `catch (Exception $e)` の `$e` から例外の情報を取り出せる
- `$e->getMessage()` で例外メッセージを文字列で取得できる
- ログ・画面表示にメッセージを使える

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | catch で受けた例外の `getMessage()` を出力する |

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 10 / Chapter 3
  目的: catch した Exception オブジェクトから getMessage() でメッセージを取り出す
  扱わない: getCode() / getFile() / getLine() / getTrace() / 複数 catch (ch04) / カスタム例外 (ch06)
  読み上げ時間目安: 3 分半〜4 分
-->

# Exception::getMessage()

Lesson 10 / Chapter 3

---

## catch で受けた `$e` は何者?

```php
<?php
try {
    throw new Exception("ファイルが無い");
} catch (Exception $e) {
    // $e は Exception オブジェクト
}
```

- `$e` は `Exception` クラスのインスタンス
- 中に「メッセージ」「行番号」「ファイル名」などの情報を持っている
- メソッドを呼べば取り出せる

---

## `getMessage()` でメッセージを取り出す

```php
<?php
try {
    throw new Exception("ファイルが無い");
} catch (Exception $e) {
    echo $e->getMessage() . "\n";
}
```

実行結果:

```
ファイルが無い
```

- `throw new Exception("...")` で渡した文字列がそのまま返る
- 文字列なので、そのまま `echo` できる

---

## ログ用に整形して出すパターン

```php
<?php
try {
    throw new Exception("DB 接続失敗");
} catch (Exception $e) {
    echo "[ERROR] " . $e->getMessage() . "\n";
}
```

実行結果:

```
[ERROR] DB 接続失敗
```

- プレフィクスを付けてログレベルを表現
- 本番では `error_log()` などに書き出す

---

## 他にも情報を取れる (参考)

| メソッド | 内容 |
|---|---|
| `getMessage()` | メッセージ (このチャプターで扱う) |
| `getCode()` | エラーコード (整数) |
| `getFile()` | 例外が投げられたファイル |
| `getLine()` | 例外が投げられた行番号 |

このチャプターでは `getMessage()` だけ使えればOK。

---

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

✅ `catch (Exception $e)` の `$e` がオブジェクトと分かる
✅ `$e->getMessage()` でメッセージを取れる
✅ ログ・画面表示にメッセージを使える

→ ドリルへ
