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


コメント