JavaScript 例外処理 (throw)

概要: このチュートリアルでは、JavaScriptの`throw`ステートメントを使用して例外を発生させる方法を学びます。

JavaScript `throw`ステートメント入門

`throw`ステートメントを使用すると、例外を発生させることができます。`throw`ステートメントの構文を以下に示します。

throw expression;Code language: JavaScript (javascript)

この構文では、`expression`が例外の値を指定します。通常、`Error`クラスまたはそのサブクラスの新しいインスタンスを使用します。

`throw`ステートメントに遭遇すると、JavaScriptエンジンは実行を停止し、コールスタックにある最初の`catch`ブロックに制御を渡します。`catch`ブロックが存在しない場合、JavaScriptエンジンはスクリプトを終了します。

JavaScript 例外処理の例

`throw`ステートメントの使用例をいくつか見てみましょう。

1) JavaScript `throw`ステートメントを使用して例外を発生させる

次の例では、`throw`ステートメントを使用して関数内で例外を発生させています。

function add(x, y) {
  if (typeof x !== 'number') {
    throw 'The first argument must be a number';
  }
  if (typeof y !== 'number') {
    throw 'The second argument must be a number';
  }

  return x + y;
}

const result = add('a', 10);
console.log(result);
Code language: JavaScript (javascript)

動作について

まず、2つの引数を受け取り、それらの合計を返す`add()`関数を定義します。`add()`関数は`typeof`演算子を使用して各引数の型をチェックし、型が数値でない場合は例外をスローします。

次に、`add()`関数を呼び出し、文字列と数値を渡します。

最後に、結果をコンソールに表示します。

最初の引数("a")が数値ではないため、スクリプトでエラーが発生します。

Uncaught The first argument must be a number

例外を処理するには、`try...catch`ステートメントを使用できます。例:

function add(x, y) {
  if (typeof x !== 'number') {
    throw 'The first argument must be a number';
  }
  if (typeof y !== 'number') {
    throw 'The second argument must be a number';
  }

  return x + y;
}

try {
  const result = add('a', 10);
  console.log(result);
} catch (e) {
  console.log(e);
}
Code language: JavaScript (javascript)

出力

The first argument must be a number

この例では、`add()`関数の呼び出しを`try`ブロックに配置しています。`throw`ステートメントの`expression`が文字列であるため、`catch`ブロックの例外は出力に示されているように文字列になります。

2) JavaScript `throw`ステートメントを使用してErrorクラスのインスタンスをスローする

次の例では、`add()`関数で文字列ではなく`Error`クラスのインスタンスをスローします。

function add(x, y) {
  if (typeof x !== 'number') {
    throw new Error('The first argument must be a number');
  }
  if (typeof y !== 'number') {
    throw new Error('The second argument must be a number');
  }

  return x + y;
}

try {
  const result = add('a', 10);
  console.log(result);
} catch (e) {
  console.log(e.name, ':', e.message);
}
Code language: JavaScript (javascript)

出力

Error : The first argument must be a numberCode language: JavaScript (javascript)

出力に示されているように、`catch`ブロックの例外オブジェクトの`name`は`Error`、`message`は`Error()`コンストラクタに渡したメッセージになります。

3) JavaScript `throw`ステートメントを使用してユーザー定義の例外をスローする

組み込みの`Error`ではなく、カスタムエラーをスローしたい場合があります。そのためには、`Error`クラスを拡張するカスタムエラークラスを定義し、そのクラスの新しいインスタンスをスローします。例:

まず、`Error`クラスを拡張する`NumberError`を定義します。

class NumberError extends Error {
  constructor(value) {
    super(`"${value}" is not a valid number`);
    this.name = 'InvalidNumber';
  }
}Code language: JavaScript (javascript)

`NumberError`クラスの`constructor()`は、クラスの新しいインスタンスを作成する際に渡す値を受け入れます。

`NumberError`クラスの`constructor()`では、`super`を使用して`Error`クラスのコンストラクタを呼び出し、文字列を渡します。また、エラーの名前をリテラル文字列`NumberError`にオーバーライドします。これをしないと、`NumberError`の`name`は`Error`になります。

次に、`add()`関数で`NumberError`クラスを使用します。


function add(x, y) {
  if (typeof x !== 'number') {
    throw new NumberError(x);
  }
  if (typeof y !== 'number') {
    throw new NumberError(y);
  }

  return x + y;
}Code language: JavaScript (javascript)

`add()`関数では、引数が有効な数値でない場合に`NumberError`クラスのインスタンスをスローします。

最後に、`add()`関数によってスローされた例外をキャッチします。

try {
  const result = add('a', 10);
  console.log(result);
} catch (e) {
  console.log(e.name, ':', e.message);
}Code language: JavaScript (javascript)

出力

InvalidNumber : "a" is not a valid numberCode language: JavaScript (javascript)

この例では、例外名は`NumberError`、メッセージは`NumberError`クラスの`constructor()`の`super()`に渡したメッセージになります。

まとめ

  • JavaScriptの`throw`ステートメントを使用して、ユーザー定義の例外をスローします。
このチュートリアルは役に立ちましたか?