
Node.jsで開発をしていると、エラーハンドリングが重要な課題になります。
特に、エラーを適切に発生させ、処理の中で適切に捕捉することは、品質の高いシステムを構築する上で欠かせません。
本記事では、エラーオブジェクトの投げ方について詳しく解説します。
なぜErrorオブジェクトを使うべきか
JavaScriptでは、単にオブジェクトをthrowすることも可能ですが、エラーのスタックトレースを適切に保持し、デバッグしやすくするためには、Errorオブジェクトを使用するのが望ましいです。
例えば、以下のようなコードは適切ではありません。
if (isError) throw { code: 409 };
このコードでは、単なるオブジェクトを投げています。catch 節で受け取った際に、Errorオブジェクトでないためスタックトレースがなく、エラーの発生箇所を特定しにくくなります。
Errorオブジェクトを適切に使う方法
new Error()を使う
エラーメッセージを適切に設定するには、new Error() を使用します。
if (isError) throw new Error("競合が発生しました");
これにより、エラーメッセージが message プロパティに格納され、catch 節で適切に処理できます。
Errorオブジェクトに追加情報を持たせる
エラーコードを含めたい場合、以下のようにオブジェクトを拡張できます。
if (isError) {
const error = new Error("競合が発生しました");
error.code = 409;
throw error;
}
catch 節で error.code を参照できるため、エラーの種類を判別しやすくなります。
Object.assignを使う
よりコンパクトに書く方法として Object.assign を使う方法があります。
if (isError) throw Object.assign(new Error("競合が発生しました"), { code: 409 });
これにより、new Error() で作成したオブジェクトに code プロパティを追加できます。
スプレッド構文を使う
Object.assign の代わりにスプレッド構文も使えます。
if (isError) throw { ...new Error("競合が発生しました"), code: 409 };
ただし、この方法は Error オブジェクトではなく通常のオブジェクトをthrowすることになるため、スタックトレースが適切に取得できない可能性があります。
Errorを拡張したカスタムエラークラスを作る
大規模なシステムでは、エラーの種類を明確にするために、Error を拡張した独自のエラークラスを作成するのが有効です。
class SomeError extends Error {
constructor() {
super("競合が発生しました");
this.code = 409;
}
}
if (isError) throw new SomeError();
カスタムエラーのメリット
instanceofを使ってエラーの種類を判別可能catch節で特定のエラーのみ処理することが可能
例えば、以下のように catch 節でエラーの種類を判別できます。
try {
if (isError) throw new SomeError();
} catch (err) {
if (err instanceof SomeError) {
console.error("競合エラー: ", err.message);
} else {
console.error("その他のエラー: ", err.message);
}
}
まとめ
エラーを適切に投げることで、デバッグやエラーハンドリングの精度が向上します。
本記事で紹介した方法を活用し、より堅牢なシステムを構築してください。
Errorオブジェクトを使用し、スタックトレースを保持するcodeなどの追加情報を持たせるObject.assignやスプレッド構文を活用する- カスタムエラークラスを作成し、エラーの種類を明確化する
適切なエラーハンドリングを実装し、エラーの発生を素早く特定できるようにしましょう。
- Original:https://minory.org/node-error-handling.html
- Source:minory
- Author:管理者