JavaScript - エラーの拡張

こんにちは、未来のJavaScript魔術師の皆さん!今日は、JavaScriptでエラーを拡張する面白い世界に飛び込みます。プログラミングが初めての方も安心してください – この冒険のガイドとして、お友達のようにサポートします。このレッスンが終わる頃には、プロのようにカスタムエラーを作成できるようになるでしょう!

JavaScript - Extending Errors

エラークラスの拡張:カスタムエラーの作成

まず基本から始めましょう。JavaScriptには、エラーオブジェクトを作成するために使用できる内蔵のErrorクラスがあります。しかし、時々、アプリケーションのためにより具体的なエラーが必要になることがあります。その際に、Errorクラスを拡張する方法が非常に便利になります!

なぜエラーを拡張するのか?

例えば、料理アプリを作成していて、キッチンの失敗に対する特定のエラーを作成したいとします。一般的なErrorを使用することもできますが、BurnedFoodErrorOverseasonedErrorがあればもっと良いでしょう。それが今日学びましょう!

エラーを拡張するための基本構文

まず簡単な例から始めましょう:

class KitchenError extends Error {
constructor(message) {
super(message);
this.name = 'KitchenError';
}
}

これを分解してみましょう:

  1. classキーワードを使用して新しいエラークラスを定義します。
  2. extends Errorは、新しいクラスが内蔵のErrorクラスを継承すべきことをJavaScriptに伝えます。
  3. constructor内でsuper(message)を呼び出して、親クラスのErrorが適切に初期化されるようにします。
  4. this.nameを設定してエラーに特定の名前を与えます。

次に、これを使ってみましょう:

try {
throw new KitchenError("スパゲッティが天井に張り付いてしまった!");
} catch (error) {
console.log(error.name); // 出力: KitchenError
console.log(error.message); // 出力: スパゲッティが天井に張り付いてしまった!
}

カスタムプロパティの追加

エラーを拡張する最大の利点の1つは、カスタムプロパティを追加できることです。KitchenErrorを強化してみましょう:

class KitchenError extends Error {
constructor(message, dish) {
super(message);
this.name = 'KitchenError';
this.dish = dish;
}
}

try {
throw new KitchenError("それは燃えてしまった!", "ラザーニャ");
} catch (error) {
console.log(`ああ、もう!${error.dish}は危険です: ${error.message}`);
// 出力: ああ、もう!ラザーニャは危険です: それは燃えてしまった!
}

この例では、エラーにdishプロパティを追加しました。これにより、キッチンの災害に関するさらに具体的な情報を提供することができます!

特定のエラータイプの作成

Errorクラスを拡張する方法を学びましたので、キッチンアプリのための特定のエラータイプを作成してみましょう:

class BurnedFoodError extends KitchenError {
constructor(dish) {
super(`The ${dish} is burned to a crisp!`, dish);
this.name = 'BurnedFoodError';
}
}

class OverseasonedError extends KitchenError {
constructor(dish, seasoning) {
super(`The ${dish} is over-seasoned with ${seasoning}!`, dish);
this.name = 'OverseasonedError';
this.seasoning = seasoning;
}
}

これらの特定のエラータイプを使ってみましょう:

function cookDinner(dish, seasoning) {
if (Math.random() < 0.5) {
throw new BurnedFoodError(dish);
} else if (Math.random() < 0.5) {
throw new OverseasonedError(dish, seasoning);
}
console.log(`Your ${dish} is perfectly cooked!`);
}

try {
cookDinner("ステーキ", "塩");
} catch (error) {
if (error instanceof BurnedFoodError) {
console.log(`ああ!${error.message} テイクアウトを注文しましょう。`);
} else if (error instanceof OverseasonedError) {
console.log(`やべ!${error.message} 次回は${error.seasoning}を少し減らしましょう。`);
} else {
console.log("キッチンで何かが間違いました!");
}
}

このコードは、料理の不確実性(少なくとも私たちの多くにとっては!)をシミュレートし、異なるエラータイプを異なる方法で処理する方法を示しています。

多段継承

さあ、エラーヒエラルキーを次のレベルに進めましょう – 文字通りです!エラータイプを chainsにして、それぞれ前のものから継承する方法を考えます。これを多段継承と呼びます。

キッチンエラーシステムを拡張してみましょう:

class KitchenApplianceError extends KitchenError {
constructor(message, appliance) {
super(message);
this.name = 'KitchenApplianceError';
this.appliance = appliance;
}
}

class OvenError extends KitchenApplianceError {
constructor(message) {
super(message, 'oven');
this.name = 'OvenError';
}
}

class MicrowaveError extends KitchenApplianceError {
constructor(message) {
super(message, 'microwave');
this.name = 'MicrowaveError';
}
}

この例では:

  • KitchenApplianceErrorKitchenErrorを継承します
  • OvenErrorMicrowaveErrorはどちらもKitchenApplianceErrorを継承します

このヒエラルキーを使ってみましょう:

function useAppliance(appliance) {
if (appliance === 'oven') {
throw new OvenError("オーブンが温まらない!");
} else if (appliance === 'microwave') {
throw new MicrowaveError("マイクロウェーブが妙な音をしている!");
}
}

try {
useAppliance('oven');
} catch (error) {
if (error instanceof OvenError) {
console.log(`オーブンの問題: ${error.message}`);
} else if (error instanceof MicrowaveError) {
console.log(`マイクロウェーブの問題: ${error.message}`);
} else if (error instanceof KitchenApplianceError) {
console.log(`一般的なアプライアンスエラー: ${error.appliance}の${error.message}`);
} else if (error instanceof KitchenError) {
console.log(`キッチンのエラー: ${error.message}`);
} else {
console.log(`予期しないエラー: ${error.message}`);
}
}

この多段継承により、非常に特定のエラータイプを作成しながらも、論理的なヒエラルキーを保つことができます。異なるspecificityレベルでエラーをキャッチすることができます。最もspecific(OvenError)から最も一般的(Error)までです。

メソッドとプロパティの表

カスタムエラーで使用した主要なメソッドとプロパティを以下の表にまとめます:

メソッド/プロパティ 説明
constructor() エラーオブジェクトを初期化 constructor(message, dish)
super() 親クラスのコンストラクタを呼び出す super(message)
this.name エラーの名前を設定 this.name = 'KitchenError'
this.[custom] カスタムプロパティを追加 this.dish = dish
instanceof オブジェクトがクラスのインスタンスかどうかを確認 if (error instanceof OvenError)

エラーを拡張することは、ただエラーの名前をカッコよくするだけではなく、コード内で異なるエラーを処理するための構造化された方法を作成することです。これにより、デバッグがしやすくなり、エラーメッセージがより具体的で情報的になります。

次回、コードで何かが間違った場合、一般的なエラーをスローするのではなく、カスタムエラーを作成してみてください!あなたのCodeSpaghettiErrorが開発チームで話題になるかもしれません。ハッピーコーディング、そしてあなたのすべてのエラーが完璧に拡張されますように!

Credits: Image by storyset