TypeScript

【TypeScript】Errorクラスを利用してカスタムエラークラスを作成する

マナビト
マナビト
こんにちはマナビトです。
普段はフロントエンドエンジニアとしてJavaScript/TypeScript/Aangular/GraphQLを
メインに開発業務を行なっています。

本日は独自のカスタムエラークラスについて記事にしていきたいと思います。

TypScriptを学習したいという方は下記書籍が便利です。

TypeScriptの型システムのからフレームワーク利用の実践まで。型定義のノウハウを凝縮

カスタムエラークラスとは

カスタムエラークラスはErrorクラスを継承して、何らかの想定範囲外のエラーが発生した際に、そのエラーをキャッチして独自のメッセージやコードを出力させる際に使用します。

TypeScript/JavaScriptは、自身で設定した引数でthrowして処理を巻き戻すことが出来る為、厳密にはErrorクラスを継承する必要はありません。ですが、継承することによってエラーオブジェクトかどうかを判別できる「 obj instanceof Error 」を実装できるようになる為、継承しておいた方が便利です。

Errorクラスは例外処理の際に情報伝達のために使用します。クラスが生成されると同時にmessage(文字列)を受け取ることができます。name属性にはクラス名が、messageには作成時にコンストラクタに渡した文字列が格納されます。

カスタムエラークラスの作成

それでは、Errorクラスをextendsで継承して独自のErrorExceptionを実装していきます。
エラー表示内容を追加したい場合は、constructorに追加していきます。

export class ErrorException extends Error {

  constructor(
      message: string,
      data?: object,
      type: 'systemError' | 'unknown',
    ) {
    super(message);
  }
}

ErrorExceptionクラスをさらに継承することでカスタムエラーを共通化させることができます。今回はエラーかどうかを判別するクラスを作成します。エラーであった場合はnewしてエラーを出力します。

export class ExceptionFactory {

 // エラーかどうか
  static isError(error: any): boolean {
    return error.errors && error.errors.length > 0;
  }

  static getException(error: any) {
    if (!this.isError(error)) {
      return;
    }
    return new Exception(
      error.errors.map((err) => ({
        message: err.message,
        type: err.extensions.type,
        data: err.extensions.data,
      }))
    );
  }
}

エラーの場合は出力するように設定を加えます。

// エラーの場合
if (ExceptionFactory.isError(error)) {
  const err = ExceptionFactory.getException(error);
     if (err.type === 'systemError') {
        console.log(err.data);
     }
}

ちなみにこの例外を受け取る際は、try...catchを使用することも出来ます。instanceofは組み合わせることで型ガードの役割を果たします。

try {
  something();
} catch(error) {
  if(error instanseof ErrorException) {
    console.log(error);
  } else {
    console.log(error);
  }
}

本日はここまでとなります。
最後までお読みいただきありがとうございました。

参考文献