普段はフロントエンドエンジニアとしてJavaScript/TypeScript/Aangular/GraphQLを
メインに開発業務を行なっています。
本日は独自のカスタムエラークラスについて記事にしていきたいと思います。
TypScriptを学習したいという方は下記書籍が便利です。
カスタムエラークラスとは
カスタムエラークラスは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); } }
本日はここまでとなります。
最後までお読みいただきありがとうございました。