---
paths: ["src/**"]
---

# エラーハンドリング方針 (Error Handling Policy)

エラー処理・ログ出力を書くときは本方針に従うこと．

## エラーの分類と処理 (Classification)

| 分類 | 例 | 処理 |
| --- | --- | --- |
| ユーザー入力エラー | 拡張子違い，クリック数超過，未読込での診断 | `gui/` でガードし，メッセージボックスで案内（文言は SPEC_01「入力ガード」） |
| データエラー | 変換行列 CSV の形式不正，data.csv の欠損 | `core/` が専用例外を送出し，`gui/` が捕捉してエラーダイアログ表示 |
| 診断失敗 | SVM が学習不能（正例不足等） | `core/` が失敗を示す結果を返し，結果画面に「Diagnosis failed」を表示（SPEC_02「診断失敗の判定」） |
| バグ（想定外） | 上記以外の例外 | 捕捉して握りつぶさない．スタックトレースをログに残して落とす |

## 規則 (Rules)

- `core/` に専用例外を定義する（例: `DataFormatError`）．`core/` は **GUI を知らない**ため，メッセージボックス表示等は行わない（依存方向は project-structure.md 参照）
- 例外の握りつぶし（`except Exception: pass`）は禁止．捕捉するのは「その場で意味のある対処ができる」場合のみ
- 入力値の検証は境界（ファイル読込直後・GUI 入力時）で行い，`core/` の内部では検証済みを前提とする
- 旧実装の「エラーをマジックナンバーで表現する」方式（診断失敗 = 特定スコア組）は移植しない．失敗は例外または明示的な結果型で表す

## ログ (Logging)

- 標準ライブラリの `logging` を使う．`print` によるデバッグ出力を残さない
- `core/` はモジュールロガー（`logging.getLogger(__name__)`）を使い，出力先の設定はエントリポイント側で行う
- 診断実行時は入力（Lab 値）と出力（5 色スコア）を INFO で記録する（研究用途での再確認・回帰テストデータの収集に使うため）
