- エラーオブジェクト整形は「原因を最速で特定するための“読みやすい形”に変換する技術」
- エラーオブジェクト整形の目的は「原因を最速で特定すること」
- ステップ1:エラーオブジェクトを安全に扱うための基礎を作る
- ステップ2:エラーオブジェクトを整形する関数を作る(最小構成)
- ステップ3:APIエラーなどの「追加情報」を取り込めるようにする
- ステップ4:循環参照を安全に処理する(重要)
- ステップ5:整形したエラーをログに出すユーティリティを作る
- ステップ6:読みやすい「整形済みエラーレポート」を作る(業務で最も使われる形)
- ステップ7:業務で使えるエラー整形ユーティリティ(完成版)
- ステップ8:業務での活用例
- 深掘り:なぜ「整形」が重要なのか
- まとめ:エラーオブジェクト整形は「障害調査のスピードを最大化する技術」
エラーオブジェクト整形は「原因を最速で特定するための“読みやすい形”に変換する技術」
エラーは業務システムの中で必ず発生します。 しかし、そのエラーをどうログに残すかで、障害調査のスピードが劇的に変わります。
初心者がやりがちなミスは次の2つです。
console.error(e)をそのまま出す- エラーオブジェクトを JSON に変換しようとして失敗する
業務では、 「エラーオブジェクトを整形して読みやすくする」 というユーティリティが必須です。
ここでは、ステップバイステップで エラーオブジェクト整形の考え方 → 実装 → 強化 → 業務テンプレート までを丁寧に解説します。
エラーオブジェクト整形の目的は「原因を最速で特定すること」
エラーオブジェクトには次の情報が含まれます。
- message:エラーの概要
- name:エラーの種類
- stack:どこで発生したか(最重要)
- custom fields:APIエラーなどで追加される情報
しかし、これらをそのままログに出すと読みづらく、 障害調査が遅くなります。
そのため、 必要な情報を抽出し、読みやすい形に整形する というユーティリティが必要になります。
ステップ1:エラーオブジェクトを安全に扱うための基礎を作る
まずは「エラーかどうか」を判定する関数を作ります。
function isError(value) {
return value instanceof Error;
}
JavaScriptこれにより、 「普通のオブジェクト」と「Errorオブジェクト」を区別できます。
ステップ2:エラーオブジェクトを整形する関数を作る(最小構成)
function formatError(error) {
if (!isError(error)) {
return { message: String(error) };
}
return {
name: error.name,
message: error.message,
stack: error.stack,
};
}
JavaScript使用例
try {
throw new Error("DB接続に失敗しました");
} catch (e) {
console.log(formatError(e));
}
JavaScript出力例:
{
"name": "Error",
"message": "DB接続に失敗しました",
"stack": "Error: DB接続に失敗しました\n at ..."
}
ステップ3:APIエラーなどの「追加情報」を取り込めるようにする
業務では、APIエラーが次のような形で返ってくることがあります。
{
"error": {
"code": "API001",
"detail": "Token expired"
}
}
そのため、追加情報を取り込む処理を追加します。
function formatError(error) {
if (!isError(error)) {
return { message: String(error) };
}
const formatted = {
name: error.name,
message: error.message,
stack: error.stack,
};
// 追加情報がある場合は取り込む
for (const key of Object.keys(error)) {
formatted[key] = error[key];
}
return formatted;
}
JavaScriptステップ4:循環参照を安全に処理する(重要)
エラーオブジェクトを JSON に変換するとき、 循環参照があると JSON.stringify が失敗します。
そのため、安全な stringify を用意します。
function safeStringify(value) {
try {
return JSON.stringify(value);
} catch {
return "[Unserializable Object]";
}
}
JavaScriptステップ5:整形したエラーをログに出すユーティリティを作る
function logFormattedError(error, context = "") {
const formatted = formatError(error);
const ctx = context ? `[${context}] ` : "";
console.error(`[ERROR] ${ctx}${safeStringify(formatted)}`);
}
JavaScript使用例
try {
JSON.parse("invalid json");
} catch (e) {
logFormattedError(e, "JsonParser");
}
JavaScriptステップ6:読みやすい「整形済みエラーレポート」を作る(業務で最も使われる形)
業務では、次のような「整形済みエラーレポート」が最も読みやすいです。
function buildErrorReport(error) {
const f = formatError(error);
return `
=== ERROR REPORT ===
Name: ${f.name}
Message: ${f.message}
Stack:
${f.stack}
====================
`.trim();
}
JavaScript使用例
try {
throw new Error("ファイル読み込みに失敗しました");
} catch (e) {
console.error(buildErrorReport(e));
}
JavaScriptステップ7:業務で使えるエラー整形ユーティリティ(完成版)
export const ErrorFormatter = {
isError(value) {
return value instanceof Error;
},
format(error) {
if (!this.isError(error)) {
return { message: String(error) };
}
const formatted = {
name: error.name,
message: error.message,
stack: error.stack,
};
for (const key of Object.keys(error)) {
formatted[key] = error[key];
}
return formatted;
},
stringify(error) {
try {
return JSON.stringify(this.format(error));
} catch {
return "[Unserializable Error]";
}
},
report(error) {
const f = this.format(error);
return `
=== ERROR REPORT ===
Name: ${f.name}
Message: ${f.message}
Stack:
${f.stack}
====================
`.trim();
},
};
JavaScriptステップ8:業務での活用例
APIエラーの整形
try {
await fetch("/api/user");
} catch (e) {
Logger.error(ErrorFormatter.stringify(e), "UserAPI");
}
JavaScriptバッチ処理の異常終了
try {
runBatch();
} catch (e) {
console.error(ErrorFormatter.report(e));
}
JavaScript外部サービスの障害
Logger.error(ErrorFormatter.stringify(e), "ExternalService");
JavaScript深掘り:なぜ「整形」が重要なのか
1. 原因特定が圧倒的に早くなる
整形されたエラーは読みやすく、 どこで何が起きたかが一目で分かります。
2. 再現が難しい障害でもログが証拠になる
本番環境では再現できない障害が多いため、 整形されたエラーが唯一の手がかりになります。
3. チーム全体で統一されたログ形式になる
誰が見ても理解できるログは、 調査の属人化を防ぎます。
4. 監視ツールとの連携がしやすくなる
整形された JSON は外部サービスに送信しやすいです。
まとめ:エラーオブジェクト整形は「障害調査のスピードを最大化する技術」
エラーオブジェクト整形を正しく扱うことで、次のメリットが得られます。
- 原因特定が高速化する
- 読みやすいログが残る
- 追加情報も取り込める
- JSON化して外部サービスに送れる
- チーム全体で統一されたログ形式になる
エラーは避けられません。 しかし、整形して読みやすくすることは必ずできます。
業務システムの品質を支える重要な基盤として、 ぜひエラー整形ユーティリティを活用してください。
