こんにちは。
野中やすおです。
業務でTypeScriptのカスタムエラーを使うことがあったので、今回の記事ではカスタムエラーについてまとめてみることにしました。
TypeScriptのカスタムエラー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
export class BaseError extends Error { constructor(message: string) { super(message); this.name = this.constructor.name; // 下記の行はTypeScriptの出力ターゲットがES2015より古い場合(ES3, ES5)のみ必要 Object.setPrototypeOf(this, new.target.prototype); } } // BaseErrorを継承して、ValidationErrorを作る class ValidationError extends BaseError { constructor(message: string) { super(message); } } |
BaseError
という名前のクラスが定義し、このクラスでは、Error
クラスを継承しています。Error
クラスは、JavaScriptの組み込みエラークラスで、例外を表すために使用されます。
次にBaseError
クラスのコンストラクタは、1つの引数message
を受け取っています。
super(message)
では、親クラスのコンストラクタを呼び出して、message
を渡しています。
次の行のthis.name
に現在のクラス名を設定しています。これによってエラーオブジェクトのname
プロパティにクラス名が表示されます。
また補足ですが、Object.setPrototypeOf(this, new.target.prototype)
は、TypeScriptの出力ターゲットがES2015より古い場合(ES3、ES5)にのみ必要な一行です。ES6の場合は不要です。
またBaseErrorクラスを継承して、ValidationErrorクラスを作成しています。上記のようにBaseErrorクラスから新しいエラークラスを作成することができます。
また実際に呼び出しする箇所では、以下のような実装になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
try { // バリデーション処理を記述 const input = "invalid input"; if (!isValid(input)) { throw new ValidationError("入力が無効です。"); } // バリデーション成功時の処理 console.log("バリデーションが成功しました。"); } catch (error) { // エラーハンドリング if (error instanceof ValidationError) { console.log("バリデーションエラーが発生しました:", error.message); } else { console.log("予期しないエラーが発生しました:", error.message); } } |
上記の例では、もし入力が無効である場合には、throw文でValidationErrorをスローします。そしてエラーオブジェクトのコンストラクタにはエラーメッセージが渡されます。
またエラーオブジェクトがValidationErrorのインスタンスであるかどうかをチェックし、それに応じて処理を行います。ValidationErrorの場合は、エラーメッセージが表示され、それ以外のエラーの場合は、予期しないエラーが発生したことを示すメッセージが表示するようにしています。
以上、カスタムエラーについてまとめてみました!
参考
JavaScriptで作ったアプリでのエラーをハンドリングしたい 例えば、Node.jsのAPIサーバーでリクエストパラ…