0Pricing
Frontend Academy · レッスン

エラーハンドリング:HTTPステータスコード

HTTPステータスコードをユーザー向けメッセージに対応付け、ネットワークエラーとサーバーエラーを区別し、リトライ処理を実装します。

「エラーハンドリング:HTTPステータスコード」はCoddyKit上の無料Frontend Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはFrontend Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Frontend Academyコースには全4レッスンが含まれています。

HTTPステータスコードの分類

ステータスコードは最初の数字で分類されます。2xxは成功、3xxはリダイレクト、4xxはクライアントエラー(こちら側の問題)、5xxはサーバーエラー(相手側の問題)です。

よく使う2xxコード

200 OK:本文を伴う成功です。201 Created:リソースが作成されました(作成された新しいリソースを返すことがよくあります)。204 No Content:本文のない成功です(DELETEや、場合によってはPUTで使用されます)。

よく使う4xxコード

400 Bad Request:入力の形式が不正です。401 Unauthorized:認証情報がないか、無効です。403 Forbidden:認証されていますが、許可されていません。404 Not Found:リソースが存在しません。409 Conflict:状態が競合しています(メールアドレスの重複など)。422 Unprocessable Entity:バリデーションに失敗しました。

よく使う5xxコード

500 Internal Server Error:一般的なサーバー障害です。502 Bad Gateway:上流サービスが失敗しました。503 Service Unavailable:サーバーが過負荷状態または停止しています。504 Gateway Timeout:上流サービスが時間内に応答しませんでした。

コードをユーザー向けメッセージに変換する

ステータスコードを役立つUIメッセージに変換します。ユーザーに「Error 500」とだけ表示してはいけません。

function userMessage(status) {
  if (status === 401) return 'Please sign in to continue.';
  if (status === 403) return "You don't have permission for that.";
  if (status === 404) return 'Not found.';
  if (status === 409) return 'Already exists.';
  if (status === 422) return 'Please check the form for errors.';
  if (status >= 500) return 'Something went wrong. Try again in a moment.';
  return 'Something unexpected happened.';
}

ネットワークエラーとサーバーエラーの違い

fetchの失敗(オフライン、DNS障害、CORS)は、サーバーがエラーレスポンスを返す場合とは異なります。ネットワークエラーは例外をスローしますが、サーバーエラーはstatusが400以上のResponseを返します。

try {
  const res = await fetch('/api/users');
  if (!res.ok) {
    // Server replied but with error status
    throw new Error(`Server error ${res.status}`);
  }
  return res.json();
} catch (err) {
  if (err instanceof TypeError) {
    // Network failure — fetch couldn't reach server
    throw new Error('Network error. Check your connection.');
  }
  throw err;
}

5xxとネットワークエラーのリトライ処理

サーバーエラーやネットワーク障害は、一時的なものであることがよくあります。指数バックオフを使ってリトライします。

async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const res = await fetch(url, options);
      if (res.ok || (res.status >= 400 && res.status < 500)) return res;
      // 5xx — retryable
    } catch (err) {
      if (attempt === maxRetries - 1) throw err;
    }
    await new Promise(r => setTimeout(r, 2 ** attempt * 1000)); // 1s, 2s, 4s
  }
}

4xxはリトライしない

4xxエラーはクライアント側の問題なので、リトライしても解決しません。リトライするのは5xxとネットワーク障害だけにします。ただし例外として429(Too Many Requests)は、Retry-Afterヘッダーを含むことが多いため、リトライできる場合があります。

Retry-Afterヘッダーの読み取り

サーバーは429や503のレスポンスにRetry-Afterを含めることがあります。その場合は、指定された秒数だけ待ってからリトライします。

const res = await fetch('/api/limited');
if (res.status === 429) {
  const after = parseInt(res.headers.get('Retry-After') || '5', 10);
  await new Promise(r => setTimeout(r, after * 1000));
  return fetch('/api/limited');
}

バリデーションエラーを表示する

422レスポンスには通常、フィールドごとのエラーを列挙したJSON本文が含まれます。該当するフォーム入力の横に表示します。

// Server response for 422:
// { errors: { email: 'Already taken', password: 'Too short' } }

if (res.status === 422) {
  const { errors } = await res.json();
  Object.entries(errors).forEach(([field, msg]) => {
    setFieldError(field, msg);
  });
}

テレメトリ:エラーをサービスに記録する

エラーをSentry、Datadog、またはLogRocketに送信すると、本番環境で発生したエラーを確認できます。リクエストURL、メソッド、ステータス、サニタイズ済みの本文を含めます(秘密情報は含めません)。

解決につながる操作を提示する

すべてのエラーUIには、ユーザーが先へ進む方法を用意します。たとえば、再試行ボタン、サポートへのリンク、正常に動作するページへ戻る方法などです。行き止まりになるエラー画面はユーザーを困らせます。

確認問題

APIが422 Unprocessable Entityを返しました。これは通常、何を意味しますか。

まとめ:HTTPエラー処理

2xxは成功、3xxはリダイレクト、4xxはクライアントエラー、5xxはサーバーエラーです。コードをユーザーにわかりやすいメッセージへ変換します。ネットワークエラー(fetchによるTypeError)とサーバーエラー(res.okがfalse)を区別します。5xxとネットワーク障害は指数バックオフでリトライし、429とRetry-Afterの場合を除いて4xxはリトライしません。422のフィールドエラーを表示し、Sentryなどのサービスにエラーを記録します。

よくある質問

「エラーハンドリング:HTTPステータスコード」レッスンは無料ですか?

はい。「エラーハンドリング:HTTPステータスコード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Frontend Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Frontend Academyコースには全4レッスンが含まれています。

「エラーハンドリング:HTTPステータスコード」で何を学びますか?

HTTPステータスコードをユーザー向けメッセージに対応付け、ネットワークエラーとサーバーエラーを区別し、リトライ処理を実装します。 ブラウザで直接実行するハンズオンコードでFrontend Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Frontend Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのFrontend Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「エラーハンドリング:HTTPステータスコード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このFrontend Academyレッスンでコードを書いて実行できますか?

はい。すべてのFrontend Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Fetch API:GET・POST・PUT・DELETE
  2. Axios:インターセプターとベース URL
  3. エラーハンドリング:HTTPステータスコード
  4. データキャッシュのためのSWRとReact Query
← Frontend Academyに戻る