実践ノート / エラー分析
スタックトレースは手がかりであり、結論ではない
最初に思いつく修正へ飛びつかず、例外を検証できる説明へ変える方法。
実際に起きたことから始める
例外の種類、メッセージ、自分で管理するコードの最初のフレームを保存します。関連する関数と渡された値も添えます。トレースは失敗時の呼び出し経路を示しますが、値が無効になった理由までは証明しません。ProductList の例では、undefined というメッセージに加え、useState() が初回描画の仮説を支える根拠になります。
別の説明も残す
初期値の誤り、応答形式の変更、エラー分岐での型の違いは、似た症状を起こします。それぞれを区別できる観察を考えます。何でもログに出すより、問題の式の直前で Array.isArray を確認し、応答の外側の構造を見る方が具体的です。機密情報がログに残らない環境で行ってください。
ガードと根本的な修正を分ける
products?.map で例外を隠せても、不正な応答は未処理のままかもしれません。配列で初期化しても、その後の異常なデータには対応できません。変更が対処する条件を明記し、読み込み中、空、失敗を別の状態として扱います。表示がないことを成功と見なさないためです。
小さな確認表で検証する
初回描画、正常で空ではない応答、空の応答、要求の失敗を確認します。試せない条件は未検証として残します。元の失敗入力を変更したコードと一緒に保存してください。AI の説明は調査計画であり、実際に観察した結果が検証の根拠です。
具体例で考える
エラー分析
作成済みの例:この固定結果はサンプル原文にのみ対応し、AI のリアルタイム回答ではありません。
原文
TypeError: Cannot read properties of undefined (reading "map")
at ProductList (ProductList.jsx:18)
const [products, setProducts] = useState();
return products.map(product => <li key={product.id}>{product.name}</li>);解説付きの結果
観察 初回描画で products.map を呼び出しますが、useState() の初期値は undefined です。 考えられる原因 初期状態が配列ではありません。この抜粋はその説明を支持しますが、API の応答形式までは確認できません。 次の確認 setProducts の前で応答の構造を調べます。配列は応答自体でしょうか、それとも response.items でしょうか。 変更案 useState([]) で初期化し、読み込み中・空データ・失敗を分けて扱います。設定前に応答を検証してください。 検証 初回描画、空の応答、正常な応答、通信失敗を確認します。この例ではコンポーネントを実行していません。