エラー画面は「失敗の通知」ではなく、ユーザーを目的に戻すための導線として設計する。本ドキュメントでは、エラーの分類、メッセージの書き方、画面構成、技術的な考慮点、チェックリストをまとめる。


目次

  1. 基本原則
  2. エラーの分類と設計方針
  3. メッセージの書き方
  4. 画面構成の要素
  5. フォームのバリデーションエラー
  6. ビジュアルデザイン
  7. アクセシビリティ
  8. 技術・運用面の考慮点
  9. よくあるアンチパターン
  10. 設計チェックリスト
  11. 参考

1. 基本原則

原則内容
何が起きたかを伝える状況を平易な言葉で説明する。「エラーが発生しました」だけで終わらせない
なぜ起きたかを伝える(可能な範囲で)原因がユーザー側か、システム側かを明確にする
次に何をすればよいかを示す再試行・戻る・問い合わせなど、具体的な行動を提示する
ユーザーを責めない「不正な入力です」ではなく「〇〇の形式で入力してください」
入力内容・作業状態を失わせないエラー後もフォーム入力や編集中のデータを保持する
一貫性を保つトーン、レイアウト、色、アイコンをサービス全体で統一する

2. エラーの分類と設計方針

エラーは発生箇所と影響範囲によって、表示方法を変える。

2.1 影響範囲による分類

種類例推奨する表示方法
フィールド単位メール形式の誤り、必須項目の未入力入力欄の直下にインラインメッセージ
フォーム/操作単位送信失敗、保存失敗フォーム上部のサマリー、トースト、バナー
コンポーネント単位一部ウィジェットのデータ取得失敗そのコンポーネント内に限定したエラー表示(画面全体は壊さない)
ページ単位404、403、500専用のエラーページ
アプリ/システム全体メンテナンス、オフライン、障害全画面表示またはグローバルバナー

2.2 原因による分類

原因例ユーザーに求める行動
ユーザー起因入力ミス、権限不足、期限切れリンク修正方法を具体的に示す
システム起因サーバーエラー、タイムアウト謝罪+再試行、または時間をおいての再アクセス
環境起因オフライン、ブラウザ非対応、ストレージ不足環境の確認・変更方法を示す
計画的メンテナンス、レート制限復旧予定時刻、待ち時間を示す

3. メッセージの書き方

3.1 構成の型

[見出し]   何が起きたか(短く)
[本文]     理由と影響(1〜2文)
[アクション] 次にできること(ボタン・リンク)
[補足]     エラーID、問い合わせ先など(必要時のみ)

3.2 良い例・悪い例

悪い例良い例改善ポイント
エラーが発生しました保存できませんでした。通信状況を確認して、もう一度お試しください。何が失敗したか+次の行動
不正な値です電話番号は半角数字で入力してください(例: 09012345678)責めない・正しい形式と例を示す
Error 500: Internal Server Error一時的な問題が発生しています。しばらくしてから再度お試しください。専門用語を避ける
ページが見つかりませんお探しのページは移動または削除された可能性があります。考えられる原因を補足
ログインに失敗しました(パスワードが違います)メールアドレスまたはパスワードが正しくありません。セキュリティ上、どちらが誤りかは明かさない

3.3 文体ガイドライン

  • 専門用語・コードを主文に出さない(ステータスコードやエラーIDは補足情報として小さく表示)
  • 否定・命令より、提案・案内の表現を使う
  • 一文を短く、結論から書く
  • ユーモアは慎重に:404など軽微なケースでは許容されるが、決済失敗・データ消失など深刻なケースでは使わない
  • 謝罪はシステム起因のときのみ。ユーザー起因のエラーで過剰に謝らない
  • 感嘆符や大文字・赤色の多用で煽らない

4. 画面構成の要素

4.1 専用エラーページ(404 / 500 など)に含めるもの

  1. サイト共通のヘッダー・ナビゲーション(迷子にさせない)
  2. わかりやすい見出し
  3. 短い説明文
  4. 主要アクション(ホームへ戻る、前のページへ戻る、再読み込み)
  5. 補助アクション(サイト内検索、よく使われるページへのリンク、問い合わせ)
  6. エラーID・発生時刻(問い合わせ時にサポートが調査できるように)
  7. イラスト・アイコン(任意。状況を補足する程度に)

4.2 ステータス別の設計ポイント

ステータス設計ポイント
400 Bad Request入力やリクエスト内容の見直しを促す
401 Unauthorizedログイン画面へ誘導し、ログイン後に元のページへ戻す
403 Forbidden権限がない旨と、権限申請・管理者への連絡方法を示す。リソースの存在自体を隠すべき場合は404を返す
404 Not Found検索ボックス、人気ページ、ホームへのリンクを置く。リンク切れの報告手段があるとよい
408 / 504 Timeout再試行ボタンを目立たせる
429 Too Many Requests待ち時間の目安を示す
500 Internal Server Error謝罪+再試行。ユーザー側の問題ではないことを明示する
503 Service Unavailableメンテナンス・障害の旨、復旧予定時刻、ステータスページへのリンク

4.3 アプリ内のエラー状態

  • 部分的な失敗は部分的に表示する:一つのAPIが失敗しても画面全体をエラーにしない
  • 空状態(Empty State)とエラーを区別する:「データが0件」と「取得に失敗した」は別の表示にする
  • オフライン時:オフラインであることをバナーで示し、閲覧可能なキャッシュは表示し続ける。復帰時に自動で再取得する
  • リトライ:自動リトライ(指数バックオフ)と手動リトライボタンを組み合わせる
  • トーストの使い分け:自動で消えるトーストは軽微な通知のみ。対応が必要なエラーはユーザーが閉じるまで残す

5. フォームのバリデーションエラー

  • エラーは該当フィールドの近く(直下)に表示する
  • 複数エラーがある場合はフォーム上部にサマリーを出し、各フィールドへのリンクを付ける
  • 送信時に最初のエラー項目へフォーカスを移動する
  • バリデーションのタイミング
    • 入力中にリアルタイムで赤くしない(入力途中でエラー扱いしない)
    • フィールドを離れたとき(blur)または送信時に検証する
    • エラー表示後は、修正された時点ですぐにエラーを解除する
  • 制約は事前に示す:文字数・形式・必須項目は、入力前にラベルやヘルプテキストで伝える
  • 入力値を消さない:エラー時もユーザーの入力を保持する(パスワードなど機密項目は例外を検討)

6. ビジュアルデザイン

  • 色だけに頼らない:赤色+アイコン+テキストの組み合わせで伝える(色覚多様性への配慮)
  • コントラスト比:テキストは WCAG AA(通常テキスト 4.5:1 以上)を満たす
  • 重要度に応じたレベル分け:エラー(赤)/警告(黄・橙)/情報(青)を一貫して使い分ける
  • アイコンの統一:エラー・警告・情報で決まったアイコンを使う
  • イラストは控えめに:主要アクションより目立たせない
  • レイアウトを崩さない:エラーメッセージ表示でレイアウトが大きくずれないよう、表示領域を考慮する

7. アクセシビリティ

  • エラーメッセージを入力欄と関連付ける(aria-describedby)
  • エラー状態の入力欄に aria-invalid="true" を設定する
  • 動的に表示されるエラーは role="alert" または aria-live でスクリーンリーダーに通知する
  • エラーページの <title> にもエラー内容を含める(例: 「ページが見つかりません | サイト名」)
  • エラー発生時にフォーカスを適切な位置(エラーサマリーや見出し)へ移動する
  • キーボードのみで全てのリカバリー操作ができるようにする

8. 技術・運用面の考慮点

8.1 セキュリティ

  • スタックトレース、SQL、内部パス、サーバー情報を表示しない
  • 認証エラーでは、アカウントの存在有無がわからないメッセージにする
  • 権限のないリソースは、必要に応じて403ではなく404で応答する

8.2 HTTPステータスとSEO

  • エラーページは正しいステータスコードを返す(404ページが200を返す「ソフト404」を避ける)
  • 恒久的に移動したページは301リダイレクトを設定する
  • メンテナンス時は503と Retry-After ヘッダーを返す

8.3 エラーページ自体の堅牢性

  • 500・503ページはアプリ本体やDB・外部APIに依存しない静的HTMLで用意する
  • CSS・画像はインライン化またはCDNなど別経路で配信し、障害時にも表示できるようにする
  • SPAではエラーバウンダリ(React の Error Boundary など)で画面全体のクラッシュを防ぐ

8.4 計測と改善

  • エラーIDを発行し、画面表示とサーバーログを紐付ける
  • エラーの発生件数・種類・発生ページを監視ツールで記録する
  • 404の参照元を分析し、リンク切れを修正する
  • 頻発するバリデーションエラーは、フォーム設計そのものを見直すシグナルとして扱う

9. よくあるアンチパターン

  • 「エラーが発生しました」だけで原因も対処も示さない
  • ブラウザ・サーバーのデフォルトエラーページをそのまま表示する
  • エラー後に入力内容がすべて消える
  • 行き止まりの画面(ナビゲーションも戻る導線もない)
  • モーダルの alert() でエラーを連発する
  • 技術的なエラーコードや英語の例外メッセージを主文として表示する
  • 一部の失敗で画面全体を真っ白にする
  • 深刻なエラー(決済失敗など)で不適切なユーモアを使う
  • 再試行ボタンが二重送信(二重決済など)を引き起こす設計になっている

10. 設計チェックリスト

メッセージ

  • 何が起きたかを平易な言葉で説明している
  • 原因(ユーザー側/システム側)がわかる
  • 次に取るべき行動が具体的に示されている
  • ユーザーを責める表現になっていない
  • 専門用語・内部情報を主文に出していない

画面・操作

  • ホームや前の画面へ戻る導線がある
  • 再試行が可能な場合は再試行ボタンがある
  • 入力内容・作業状態が保持される
  • 部分的な失敗が画面全体を壊さない
  • 空状態とエラー状態が区別されている
  • 問い合わせ用のエラーIDが確認できる

アクセシビリティ・デザイン

  • 色以外(アイコン・テキスト)でもエラーが伝わる
  • コントラスト比を満たしている
  • スクリーンリーダーでエラーが読み上げられる
  • エラー時に適切な位置へフォーカスが移動する

技術

  • 正しいHTTPステータスコードを返している
  • 500/503ページが依存先の障害時でも表示できる
  • スタックトレース等の内部情報が漏れていない
  • 再試行で二重処理が起きない(冪等性が担保されている)
  • エラーが計測・監視されている

参考

  • Nielsen Norman Group「Error-Message Guidelines」
  • W3C WCAG 2.2(3.3 入力支援:エラーの特定、エラー修正の提案)
  • Material Design / Apple Human Interface Guidelines のエラー・アラートに関するガイドライン
  • GOV.UK Design System「Error message」「Error summary」コンポーネント

0件のページ