TypeScript開発の新たな武器:カスタムエラークラスでエラーを制圧
TypeScript でエラークラスを拡張する方法
JavaScript には、例外を処理するための組み込みの Error
クラスがあります。しかし、アプリケーションが大きくなるにつれて、より具体的なエラー情報を提供できるカスタム エラー クラスを作成することが重要になります。TypeScript では、Error
クラスを拡張して独自のエラー クラスを作成することができます。
カスタム エラー クラスを作成する利点
- より具体的なエラー情報を提供できます。
- エラー処理をより容易にすることができます。
- コードをより保守しやすくなります。
カスタム エラー クラスを作成するには、次の手順を実行します。
Error
クラスを継承する新しいクラスを作成します。- コンストラクタを定義します。コンストラクタは、エラー メッセージやその他の関連情報を受け取る必要があります。
- 必要に応じて、プロパティやメソッドを定義します。
- エラーが発生したときに、新しいエラー クラスのインスタンスをスローします。
例
以下の例では、ValidationError
という新しいエラー クラスを作成します。このエラー クラスは、フォーム検証エラーを表すために使用されます。
class ValidationError extends Error {
constructor(message: string) {
super(message);
}
}
このエラー クラスは次のように使用できます。
try {
validateForm(data);
} catch (error) {
if (error instanceof ValidationError) {
console.error(error.message);
} else {
console.error(error);
}
}
追加のヒント
- さまざまな種類のエラーを表すために、複数のカスタム エラー クラスを作成できます。
- エラー コードを定義して、エラーをより簡単に識別できるようにすることができます。
- スタック トレースを保存して、エラーの発生場所を追跡できるようにすることができます。
TypeScript でエラークラスを拡張する:サンプルコード
以下の例は、TypeScript で Error
クラスを拡張してカスタム エラー クラスを作成する方法を示しています。
class ValidationError extends Error {
constructor(message: string) {
super(message);
this.name = 'ValidationError'; // エラーの名前を定義
}
}
この例では、ValidationError
という名前のカスタム エラー クラスを作成しています。このクラスは Error
クラスを継承しており、コンストラクタはエラー メッセージを受け取ります。コンストラクタ内では、super()
メソッドを使用して基底クラスのコンストラクタを呼び出し、エラー メッセージを message
プロパティに設定します。さらに、name
プロパティにエラーの名前を設定しています。
エラーが発生したときにカスタム エラー クラスをスローする
function validateForm(data: any): void {
if (!data.name) {
throw new ValidationError('名前は必須です'); // カスタムエラーをスロー
}
if (!data.email || !/@.*\./.test(data.email)) {
throw new ValidationError('有効なメールアドレスを入力してください'); // カスタムエラーをスロー
}
}
この例では、validateForm
関数を使用してフォーム データを検証しています。データが無効な場合、ValidationError
インスタンスを作成してスローします。エラー メッセージはコンストラクタで設定されます。
エラーをキャッチして処理する
try {
validateForm({
name: 'John Doe',
email: '[email protected]'
});
} catch (error) {
if (error instanceof ValidationError) {
console.error('エラー:', error.message);
} else {
console.error('予期せぬエラーが発生しました。', error);
}
}
この例では、try...catch
ブロックを使用して、validateForm
関数からのエラーをキャッチしています。error
変数には、スローされたエラー インスタンスが格納されます。error instanceof ValidationError
を使用して、エラーが ValidationError
インスタンスかどうかを確認します。エラーが ValidationError
インスタンスの場合は、message
プロパティを使用してエラー メッセージを出力します。エラーが ValidationError
インスタンスではない場合は、エラー オブジェクト全体を出力します。
この例は、TypeScript でエラークラスを拡張してカスタム エラーを作成する方法を基本的な例で示しています。具体的なニーズに合わせて、この例を拡張して、独自のエラー クラスを作成することができます。
- 特定のライブラリや API に関連するエラーを表すカスタム エラー クラスを作成する
- デバッグを容易にするために、追加の情報を提供するカスタム エラー クラスを作成する
- ログ記録やレポート機能と統合するカスタム エラー クラスを作成する
TypeScript でエラークラスを拡張する:その他の方法
前述の基本的な方法に加えて、TypeScript でエラークラスを拡張する際に役立つその他の方法をいくつか紹介します。
継承とポリモーフィズムを利用する
さまざまな種類のエラーを表すために、エラー クラスの階層を作成することができます。各サブクラスは、より具体的なエラー情報を提供するために、基底クラスの機能を拡張することができます。
abstract class BaseError extends Error {
constructor(message: string) {
super(message);
}
}
class ValidationError extends BaseError {
constructor(message: string) {
super(message);
this.name = 'ValidationError';
}
}
class ServerError extends BaseError {
constructor(message: string) {
super(message);
this.name = 'ServerError';
}
}
この例では、BaseError
という抽象クラスを作成して、共通のプロパティとメソッドを定義しています。ValidationError
と ServerError
は BaseError
を継承するサブクラスで、それぞれ固有のエラー情報を提供します。
ジェネリックを使用する
エラー オブジェクトに関連付けられているデータをより柔軟に制御するために、ジェネリックを使用することができます。
class ValidationError<T> extends Error {
constructor(message: string, public readonly errors: T) {
super(message);
this.name = 'ValidationError';
}
}
この例では、ValidationError
クラスをジェネリックにして、errors
プロパティの型をパラメータとして受け取ります。これにより、エラー オブジェクトに任意の種類のデータを格納することができます。
Decorator を使用する
エラー クラスの機能をさらに拡張するために、デコレータを使用することができます。
function validate(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
try {
originalMethod.apply(this, args);
} catch (error) {
if (error instanceof ValidationError) {
throw new ValidationError(`検証エラーが発生しました: ${error.message}`);
} else {
throw error;
}
}
};
}
class User {
@validate
login(username: string, password: string): void {
// ログイン処理
}
}
この例では、validate
デコレータを作成して、デコレータされたメソッドがスローするエラーをラップするようにします。エラーが ValidationError
インスタンスの場合は、エラー メッセージに追加情報を追加してから再スローします。
型エイリアスを使用する
type ValidationErrorData = {
field: string;
message: string;
};
class ValidationError extends Error {
constructor(message: string, public readonly errors: ValidationErrorData[]) {
super(message);
this.name = 'ValidationError';
}
}
この例では、ValidationErrorData
という型エイリアスを作成して、ValidationError
オブジェクトの errors
プロパティが持つデータの構造を定義します。これにより、コード的可読性と開発者エクスペリエンスが向上します。
これらの方法は、TypeScript でエラークラスを拡張して、アプリケーションのエラー処理機能をより強力で柔軟なものにするために使用できます。
javascript typescript