エラーハンドリング: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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Fetch API:GET・POST・PUT・DELETE
- Axios:インターセプターとベース URL
- エラーハンドリング:HTTPステータスコード
- データキャッシュのためのSWRとReact Query