# 画面設計書 36-例外表示画面

## 概要

本ドキュメントは、Laravelフレームワークの例外表示画面（show.blade.php）の画面設計書である。開発環境でアプリケーション例外が発生した際に、詳細なデバッグ情報を表示するメイン画面について記述する。

### 本画面の処理概要

例外表示画面は、Laravelアプリケーションで例外が発生した際に、開発者がデバッグに必要な情報を一覧できる詳細画面である。例外クラス名、メッセージ、スタックトレース、実行されたSQLクエリ、ルーティング情報、リクエスト情報などを統合的に表示する。

**業務上の目的・背景**：開発中にエラーが発生した際、原因を素早く特定しデバッグを効率化することが重要である。本画面は、例外の発生箇所、関連するコード、データベースクエリ、HTTPリクエスト情報など、デバッグに必要なすべての情報を一画面に集約し、問題解決までの時間を短縮する。

**画面へのアクセス方法**：本画面はアプリケーションで未処理の例外が発生した際に自動的に表示される。APP_DEBUG=trueの環境（通常は開発環境）でのみ詳細情報が表示される。

**主要な操作・処理内容**：
1. 例外クラス名とメッセージの確認
2. 発生ファイル・行番号の特定
3. スタックトレースの展開・確認
4. 実行されたDBクエリの確認
5. リクエストヘッダー・ボディの確認
6. ルーティング情報の確認
7. Markdown形式でのクリップボードコピー

**画面遷移**：本画面からの遷移はない。例外発生時に表示される終端画面である。

**権限による表示制御**：APP_DEBUG設定により詳細表示の可否が制御される。本番環境（APP_DEBUG=false）では詳細情報は表示されない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 36 | ビューファクトリ | 主機能 | 例外詳細情報の描画処理 |
| 46 | ログ管理 | 補助機能 | 例外情報のログ出力連携 |

## 画面種別

詳細（例外詳細表示画面）

## URL/ルーティング

N/A（例外ハンドラによって自動的にレンダリングされる）

## 入出力項目

| 項目名 | 種別 | データ型 | 必須 | 説明 |
|--------|------|----------|------|------|
| $exception | 入力 | Exception | Yes | 例外情報を保持するラッパーオブジェクト |
| $exceptionAsMarkdown | 入力 | string | Yes | 例外情報のMarkdown形式文字列 |

## 表示項目

| 項目名 | 説明 | 表示形式 |
|--------|------|----------|
| 例外タイトル | HTTPステータステキスト | テキスト |
| 例外クラス名 | 例外のクラス名（FQCN） | テキスト |
| 例外メッセージ | 例外の詳細メッセージ | テキスト |
| 発生ファイル | エラー発生ファイルパス | テキスト |
| 行番号 | エラー発生行 | 数値 |
| Laravelバージョン | フレームワークバージョン | バッジ |
| PHPバージョン | PHP実行環境バージョン | バッジ |
| エラーコード | 例外コード | バッジ |
| スタックトレース | 呼び出し階層の詳細 | 折りたたみリスト |
| DBクエリ | 実行されたSQLクエリ一覧 | テーブル |
| リクエストヘッダー | HTTPリクエストヘッダー | キーバリュー形式 |
| リクエストボディ | HTTPリクエストボディ | JSON形式 |
| ルーティング情報 | マッチしたルート情報 | キーバリュー形式 |
| ルートパラメータ | ルートパラメータ値 | JSON形式 |

## イベント仕様

### 1-例外レンダリング

例外発生時にRendererクラスによって画面がレンダリングされる。

**処理フロー**:
1. HtmlErrorRendererで例外をFlattenExceptionに変換
2. BladeMapperでBladeファイルの行番号をマッピング
3. Exceptionラッパーオブジェクトを生成
4. markdown.blade.phpでMarkdown形式の例外情報を生成
5. show.blade.phpで画面をレンダリング

### 2-Markdownコピー

トップバーの「Copy as Markdown」ボタンをクリックすると、例外情報がクリップボードにコピーされる。

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| N/A | - | - | データベース操作なし（読み取り専用画面） |

## メッセージ仕様

| メッセージ | 種別 | 条件 |
|-----------|------|------|
| UNHANDLED | エラーバッジ | 未処理例外を示すバッジ |
| CODE {n} | エラーバッジ | 例外コードを示すバッジ |
| Copied to clipboard | 成功 | Markdown形式でコピー成功時 |

## 例外処理

| 例外 | 条件 | 対応 |
|------|------|------|
| テンプレート未発見 | 部品ファイルが存在しない場合 | フォールバック表示 |

## 備考

- 開発環境専用の画面であり、本番環境では詳細情報を表示しない
- ダークモード対応（OSの設定に従う）
- レスポンシブデザイン対応
- Viteホットリロード対応（開発時）
- ユニットテスト実行時およびコンソール実行時はLaravelアスキーアートスポットライトが非表示

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

例外表示に使用されるデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Exception.php | `src/Illuminate/Foundation/Exceptions/Renderer/Exception.php` | 例外ラッパークラス。title(), message(), class(), frames()等のメソッド |
| 1-2 | Frame.php | `src/Illuminate/Foundation/Exceptions/Renderer/Frame.php` | スタックフレームを表すクラス |

**読解のコツ**: Exceptionクラスは`FlattenException`をラップし、ビューで使いやすいインターフェースを提供している。

#### Step 2: エントリーポイントを理解する

例外レンダリングの起点となるクラスを特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Renderer.php | `src/Illuminate/Foundation/Exceptions/Renderer/Renderer.php` | `render()`メソッド（85-101行目）がレンダリング起点 |

**主要処理フロー**:
1. **87-89行目**: HtmlErrorRendererで例外を変換し、BladeMapperでマッピング
2. **91行目**: Exceptionラッパーオブジェクトを生成
3. **93-95行目**: markdown.blade.phpでMarkdown形式を生成
4. **97-100行目**: show.blade.phpで最終的なHTML出力

#### Step 3: メインビューを理解する

show.blade.phpの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | show.blade.php | `src/Illuminate/Foundation/resources/exceptions/renderer/show.blade.php` | メイン画面の構成（39行） |

**主要処理フロー**:
- **1行目**: layoutコンポーネントで全体を囲む
- **2-4行目**: topbarコンポーネント（タイトルとMarkdownコピー）
- **8-10行目**: headerコンポーネント（例外クラス、メッセージ、バージョン情報）
- **14-18行目**: traceとqueryコンポーネント
- **22-30行目**: request-header, request-body, routing, routing-parameterコンポーネント
- **34-38行目**: Laravelアスキーアートスポットライト（条件付き表示）

### プログラム呼び出し階層図

```
Renderer::render()
    │
    ├─ HtmlErrorRenderer::render()
    │
    ├─ BladeMapper::map()
    │
    ├─ new Exception()
    │
    ├─ ViewFactory::make('markdown') ───▶ markdown.blade.php
    │
    └─ ViewFactory::make('show') ───▶ show.blade.php
           │
           ├─ <x-laravel-exceptions-renderer::layout>
           ├─ <x-laravel-exceptions-renderer::topbar>
           ├─ <x-laravel-exceptions-renderer::header>
           ├─ <x-laravel-exceptions-renderer::trace>
           ├─ <x-laravel-exceptions-renderer::query>
           ├─ <x-laravel-exceptions-renderer::request-header>
           ├─ <x-laravel-exceptions-renderer::request-body>
           ├─ <x-laravel-exceptions-renderer::routing>
           ├─ <x-laravel-exceptions-renderer::routing-parameter>
           └─ <x-laravel-exceptions-renderer::laravel-ascii-spotlight>
```

### データフロー図

```
[入力]                [処理]                         [出力]

Throwable ───▶ HtmlErrorRenderer ───▶ FlattenException
                      │
                      ▼
              BladeMapper::map()
                      │
                      ▼
              Exception wrapper
                      │
          ┌───────────┴───────────┐
          ▼                       ▼
   markdown.blade.php      show.blade.php
          │                       │
          ▼                       ▼
   Markdown文字列           HTML出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| show.blade.php | `src/Illuminate/Foundation/resources/exceptions/renderer/show.blade.php` | テンプレート | 例外表示メイン画面 |
| Renderer.php | `src/Illuminate/Foundation/Exceptions/Renderer/Renderer.php` | ソース | 例外レンダリングクラス |
| Exception.php | `src/Illuminate/Foundation/Exceptions/Renderer/Exception.php` | ソース | 例外ラッパークラス |
| Frame.php | `src/Illuminate/Foundation/Exceptions/Renderer/Frame.php` | ソース | スタックフレームクラス |
| Listener.php | `src/Illuminate/Foundation/Exceptions/Renderer/Listener.php` | ソース | DBクエリリスナー |
| BladeMapper.php | `src/Illuminate/Foundation/Exceptions/Renderer/Mappers/BladeMapper.php` | ソース | Blade行番号マッパー |
| layout.blade.php | `src/Illuminate/Foundation/resources/exceptions/renderer/components/layout.blade.php` | テンプレート | 共通レイアウト |
| header.blade.php | `src/Illuminate/Foundation/resources/exceptions/renderer/components/header.blade.php` | テンプレート | ヘッダーコンポーネント |
| topbar.blade.php | `src/Illuminate/Foundation/resources/exceptions/renderer/components/topbar.blade.php` | テンプレート | トップバーコンポーネント |
| trace.blade.php | `src/Illuminate/Foundation/resources/exceptions/renderer/components/trace.blade.php` | テンプレート | スタックトレース表示 |
| markdown.blade.php | `src/Illuminate/Foundation/resources/exceptions/renderer/markdown.blade.php` | テンプレート | Markdown形式出力 |
