- try/catch を共通化することは「エラー処理を一箇所に集約し、コードの安全性と保守性を最大化する技術」
- try/catch 共通化の目的は「エラー処理を一箇所に集約すること」
- ステップ1:try/catch をラップする関数を作る(最小構成)
- ステップ2:エラーを握りつぶさず、整形してログに出す
- ステップ3:コンテキスト(どの処理で失敗したか)を付けられるようにする
- ステップ4:成功時と失敗時の戻り値を統一する(重要)
- ステップ5:同期関数にも使えるようにする
- ステップ6:業務で使える try/catch 共通化ユーティリティ(完成版)
- ステップ7:業務での活用例
- try/catch 共通化の深掘り:なぜこれが重要なのか
- まとめ:try/catch 共通化は「エラー処理の品質を劇的に向上させる技術」
try/catch を共通化することは「エラー処理を一箇所に集約し、コードの安全性と保守性を最大化する技術」
業務システムでは、あらゆる場所でエラーが発生します。 API 呼び出し、DB 操作、ファイル読み込み、計算処理、外部サービス連携など、 どれも失敗する可能性があります。
初心者が必ず直面する問題は次のとおりです。
- try/catch があちこちに散らばってコードが読みにくい
- catch の中で毎回同じ処理を書いてしまう
- エラーのログ形式が統一されない
- エラーを握りつぶしてしまい原因が分からなくなる
これを解決するのが try/catch の共通化(エラー処理の一元化) です。
ここでは、ステップバイステップで try/catch 共通化の考え方 → 実装 → 強化 → 業務テンプレート までを丁寧に解説します。
try/catch 共通化の目的は「エラー処理を一箇所に集約すること」
try/catch が散らばると起きる問題
- コードが長くなる
- エラー処理が重複する
- ログ形式がバラバラになる
- 修正が大変になる
- 例外を握りつぶしてしまう危険がある
業務では、 「エラー処理は共通化し、業務ロジックはシンプルに保つ」 という設計が必須です。
ステップ1:try/catch をラップする関数を作る(最小構成)
まずは「関数を安全に実行するためのラッパー」を作ります。
async function safeExecute(fn) {
try {
return await fn();
} catch (e) {
console.error("エラーが発生しました:", e);
return null;
}
}
JavaScript使用例
const result = await safeExecute(() => fetch("/api/user"));
JavaScriptステップ2:エラーを握りつぶさず、整形してログに出す
業務では、エラーをそのまま出すのではなく、 整形して読みやすくする必要があります。
function formatError(e) {
return {
name: e.name,
message: e.message,
stack: e.stack,
};
}
JavaScriptこれを safeExecute に組み込みます。
async function safeExecute(fn) {
try {
return await fn();
} catch (e) {
console.error("[ERROR]", formatError(e));
return null;
}
}
JavaScriptステップ3:コンテキスト(どの処理で失敗したか)を付けられるようにする
業務では「どの処理でエラーが起きたか」が重要です。
async function safeExecute(fn, context = "") {
try {
return await fn();
} catch (e) {
console.error(`[ERROR] [${context}]`, formatError(e));
return null;
}
}
JavaScript使用例
await safeExecute(() => fetch("/api/user"), "UserAPI");
JavaScriptステップ4:成功時と失敗時の戻り値を統一する(重要)
try/catch が散らばると、 成功時と失敗時の戻り値がバラバラになりがちです。
共通化することで、 成功 → { ok: true, value } 失敗 → { ok: false, error } という統一形式にできます。
async function safeExecute(fn, context = "") {
try {
const value = await fn();
return { ok: true, value };
} catch (e) {
console.error(`[ERROR] [${context}]`, formatError(e));
return { ok: false, error: formatError(e) };
}
}
JavaScriptステップ5:同期関数にも使えるようにする
非同期だけでなく、同期関数にも使えるようにします。
function safeExecuteSync(fn, context = "") {
try {
const value = fn();
return { ok: true, value };
} catch (e) {
console.error(`[ERROR] [${context}]`, formatError(e));
return { ok: false, error: formatError(e) };
}
}
JavaScriptステップ6:業務で使える try/catch 共通化ユーティリティ(完成版)
export const TryCatchUtil = {
formatError(e) {
return {
name: e.name,
message: e.message,
stack: e.stack,
...Object.keys(e).reduce((acc, key) => {
acc[key] = e[key];
return acc;
}, {}),
};
},
async run(fn, context = "") {
try {
const value = await fn();
return { ok: true, value };
} catch (e) {
console.error(`[ERROR] [${context}]`, this.formatError(e));
return { ok: false, error: this.formatError(e) };
}
},
runSync(fn, context = "") {
try {
const value = fn();
return { ok: true, value };
} catch (e) {
console.error(`[ERROR] [${context}]`, this.formatError(e));
return { ok: false, error: this.formatError(e) };
}
},
};
JavaScriptステップ7:業務での活用例
API 呼び出し
const res = await TryCatchUtil.run(() => fetch("/api/user"), "UserAPI");
if (!res.ok) {
return;
}
console.log(res.value);
JavaScriptDB 操作
const result = TryCatchUtil.runSync(() => db.query("SELECT * FROM users"), "DBQuery");
JavaScriptバッチ処理
const batch = await TryCatchUtil.run(runBatch, "SalesBatch");
JavaScript外部サービス連携
const payment = await TryCatchUtil.run(() => callPaymentAPI(), "PaymentGateway");
JavaScripttry/catch 共通化の深掘り:なぜこれが重要なのか
1. エラー処理が一箇所に集約される
修正が必要なとき、共通ユーティリティだけ直せばよいです。
2. ログ形式が統一される
障害調査が圧倒的に楽になります。
3. 成功・失敗の戻り値が統一される
業務ロジックがシンプルになります。
4. エラーを握りつぶす危険がなくなる
共通化により、必ずログが出るようになります。
5. コードが短くなり、読みやすくなる
try/catch が消えることで、業務ロジックが明確になります。
まとめ:try/catch 共通化は「エラー処理の品質を劇的に向上させる技術」
try/catch を共通化することで、次のメリットが得られます。
- エラー処理が一元化される
- ログ形式が統一される
- 成功・失敗の戻り値が統一される
- コードが短くなり読みやすくなる
- 障害調査が高速化する
try/catch はただの構文ではなく、 共通化することで業務システムの品質を大きく向上させる重要な技術です。
