Node.jsのエラーハンドリング:適切なエラーオブジェクトの投げ方

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 やスプレッド構文を活用する
  • カスタムエラークラスを作成し、エラーの種類を明確化する

    適切なエラーハンドリングを実装し、エラーの発生を素早く特定できるようにしましょう。


    Amazonベストセラー

    返信を残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です

    CAPTCHA