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:管理者
Amazonベストセラー
Now loading...