TypeScript カスタム エラー クラス
JavaScript では、エラーが発生した際に Error
オブジェクトが投げられます。このオブジェクトには、message
プロパティなど基本的な情報が含まれています。しかし、より具体的なエラー情報を提供するために、Error
クラスを拡張してカスタムエラークラスを作成することができます。TypeScript では、この拡張を型安全に行うことができます。
カスタムエラークラスの作成
class MyCustomError extends Error {
constructor(message: string) {
super(message);
this.name = 'MyCustomError';
}
}
解説
- 継承
MyCustomError
クラスはError
クラスを継承しています。これにより、Error
クラスのすべてのプロパティとメソッドを継承します。 - コンストラクタ
カスタムエラークラスのコンストラクタは、親クラスのコンストラクタをsuper()
を使って呼び出します。この際、エラーメッセージを親クラスに渡します。 - 名前の設定
this.name
を設定して、エラーの種類を明確にします。
カスタムエラーの投げ方
function myFunction() {
if (/* some condition */) {
throw new MyCustomError('Custom error message');
}
}
カスタムエラーのキャッチ
try {
myFunction();
} catch (error) {
if (error instanceof MyCustomError) {
console.error('Custom error:', error.message);
} else {
console.error('Other error:', error.message);
}
}
メリット
- コードの可読性
カスタムエラーを使用することで、コードの意図を明確にし、読みやすさを向上できます。 - 型安全
TypeScript の型システムにより、カスタムエラーの型を定義し、コンパイル時にエラーをチェックできます。 - エラーハンドリングの強化
カスタムエラーを使用することで、より具体的なエラー情報を提供し、エラーハンドリングを改善できます。
TypeScript での Error クラス拡張とカスタムエラークラスの例
JavaScript の組み込みの Error
クラスは、エラーが発生した際に基本的な情報を提供しますが、より詳細なエラー情報を表現したい場合、カスタムエラークラスを作成することで、エラーハンドリングをより柔軟かつ効率的に行うことができます。TypeScript の型システムを活用することで、カスタムエラークラスを安全かつ正確に定義することができます。
class CustomError extends Error {
constructor(message: string) {
super(message);
this.name = 'CustomError';
}
}
// 使用例
try {
// エラーが発生する可能性のある処理
throw new CustomError('何かしらのエラーが発生しました');
} catch (error) {
if (error instanceof CustomError) {
console.error('カスタムエラーが発生しました:', error.message);
} else {
console.error('その他のエラーが発生しました:', error.message);
}
}
解説
- エラーのキャッチ
instanceof
演算子を使って、キャッチされたエラーがカスタムエラーかどうかを判定します。 - エラーの投げ方
throw new CustomError()
でカスタムエラーを投げます。 - name プロパティ
this.name
にカスタムエラーの名前を設定することで、エラーの種類を特定しやすくなります。 - コンストラクタ
super(message)
で親クラスのコンストラクタを呼び出し、エラーメッセージを設定します。
より詳細なカスタムエラークラス
class ValidationError extends Error {
constructor(message: string, public field: string) {
super(message);
this.name = 'ValidationError';
}
}
// 使用例
function validate(data: any) {
if (!data.name) {
throw new ValidationError('名前が入力されていません', 'name');
}
}
- 具体的なエラー
ValidationError
クラスは、入力値の検証エラーに特化したカスタムエラークラスです。 - 追加のプロパティ
field
プロパティを追加することで、どのフィールドでエラーが発生したのかを特定できます。
- コードの可読性向上
カスタムエラークラスを使用することで、コードの意図が明確になり、可読性が向上します。 - エラー情報の詳細化
カスタムエラークラスに独自のプロパティを追加することで、エラーの原因や状況をより詳細に把握できます。 - エラーの種類の特定
カスタムエラークラスを使用することで、エラーの種類を明確に区別し、適切なエラー処理を行うことができます。
TypeScript で Error クラスを拡張することで、アプリケーションに特化したカスタムエラークラスを作成し、エラーハンドリングをより効率的に行うことができます。カスタムエラークラスは、アプリケーションの安定性と保守性を高める上で非常に重要な役割を果たします。
ポイント
- エラーハンドリングのロジックは、カスタムエラーの種類に応じて適切に分岐させましょう。
- エラーメッセージは、エラーの原因を特定するのに役立つように、できるだけ詳細な情報を含めましょう。
- カスタムエラークラスを作成する際は、エラーの種類や必要な情報に合わせて適切なプロパティを追加しましょう。
- より複雑なエラー処理を行う場合は、エラーオブジェクトにスタックトレースなどの情報を追加することも検討できます。
- カスタムエラークラスは、独自のエラーコードやステータスコードを持つように拡張することも可能です。
- TypeScript の Error クラスの拡張は、JavaScript の Error オブジェクトの拡張と同様の概念です。
ネストされた Error クラス
class NetworkError extends Error {
constructor(message: string) {
super(message);
this.name = 'NetworkError';
}
}
class AuthenticationError extends NetworkError {
constructor(message: string) {
super(message);
this.name = 'AuthenticationError';
}
}
この方法では、特定のエラータイプを階層的に表現できます。例えば、NetworkError
を基底クラスとして、AuthenticationError
や TimeoutError
などのサブクラスを作成できます。
Error クラスの拡張と Mixin パターン
class ErrorWithCode extends Error {
constructor(message: string, public code: number) {
super(message);
}
}
function withLogging<T extends new (...args: any[]) => Error>(BaseError: T) {
return class extends BaseError {
constructor(...args: any[]) {
super(...args);
console.error(`Error occurred: ${this.message}`);
}
};
}
const LoggedErrorWithCode = withLogging(ErrorWithCode);
この方法では、Mixin パターンを使用して、複数のエラークラスに共通する機能を追加できます。例えば、withLogging
ミキシンは、エラーが発生した際にログを出力する機能を追加します。
カスタムエラークラスは、エラーハンドリングをより柔軟かつ効率的に行うために活用できます。以下にいくつかの活用方法を紹介します。
javascript typescript