Error
=====

`Error` オブジェクトは、実行時エラーが発生した時に発生します。 `Error` オブジェクトは、ユーザー定義の例外の基底オブジェクトとして使用することもできます。標準の組み込みエラー型については下記を参照してください。

解説
--

実行時エラーが発生すると、新しい `Error` オブジェクトが生成されスローされます。

### エラーの型

JavaScript には、一般的な `Error` コンストラクターの他に、中核となる 7 つのエラーコンストラクターがあります。クライアント側の例外については、例外処理文を参照してください。

`EvalError`

グローバル関数 `eval()` (en-US) に関して発生するエラーを表すインスタンスを生成します。

`InternalError`

"too much recursion" (深すぎる再帰) など、JavaScript エンジンで内部エラーが発生した時に発生するエラーを表すインスタンスを生成します。

`RangeError`

数値変数または引数が、その有効範囲外である場合に発生するエラーを表すインスタンスを生成します。

`ReferenceError`

不正な参照から参照先の値を取得した時に発生するエラーを表すインスタンスを生成します。

`SyntaxError`

構文エラーを表すインスタンスを生成します。

`TypeError`

変数または引数の型が有効でない場合に発生するエラーを表すインスタンスを生成します。

`URIError`

`encodeURI()` または `decodeURI()` に不正な引数が渡された時に発生するエラーを表すインスタンスを生成します。

コンストラクター
--------

`Error()`

新しい `Error` オブジェクトを生成します。

静的メソッド
------

`Error.captureStackTrace()`

標準外の **V8** の関数で、 Error インスタンスに `stack` プロパティを生成します。

インスタンスプロパティ
-----------

`Error.prototype.message`

エラーメッセージ。

`Error.prototype.name`

エラーの名称。

`Error.prototype.description`

標準外の Microsoft のプロパティで、エラーの説明です。 `message` と似ています。

`Error.prototype.number`

標準外の Microsoft のプロパティで、エラー番号です。

`Error.prototype.fileName`

標準外の Mozilla のプロパティで、このエラーが発生したファイルへのパスです。

`Error.prototype.lineNumber`

標準外の Mozilla のプロパティで、このエラーが発生したファイル内の行番号です。

`Error.prototype.columnNumber`

標準外の Mozilla のプロパティで、このエラーが発生した行内の桁番号です。

`Error.prototype.stack`

標準外の Mozilla プロパティで、スタックトレースです。

インスタンスメソッド
----------

`Error.prototype.toString()`

指定したオブジェクトを表す文字列を返します。`Object.prototype.toString()` メソッドを上書きします。

例
-

### 一般的なエラーを発生させる

通常、`throw` キーワードを使い意図的にエラーを発生させて `Error` オブジェクトを生成します。 `try...catch` 構文を使用してエラーを処理してください:


```js
try {
  throw new Error("Whoops!");
} catch (e) {
  console.error(e.name + ": " + e.message);
}
```

### 特定のエラーを処理する

エラーの `constructor` プロパティでエラー型をテストすることにより、特定のエラー型だけを選んで処理できます。または、最近の JavaScript エンジン向けに書いているのであれば、`instanceof` キーワードが使えます:


```js
try {
  foo.bar();
} catch (e) {
  if (e instanceof EvalError) {
    console.error(e.name + ": " + e.message);
  } else if (e instanceof RangeError) {
    console.error(e.name + ": " + e.message);
  }
  // ... etc
}
```

### 独自のエラー型

`Error` から派生した独自のエラー型を定義して `throw new CustomError()` ができるようにし、`instanceof CustomError` で例外ハンドラー内のエラーの種類を確認したいでしょう。これを行う一般的な方法の実例を以下に示します。

StackOverflow の突っ込んだ議論、 "What's a good way to extend Error in JavaScript?" も参照してください。

#### ES6 独自のエラークラス

**警告:** Babel 7 以前では独自のエラークラスのメソッドを使用することができますが、 Object.defineProperty() で宣言された場合に限定されます。 そうでない場合、古い Babel やそれ以外のトランスパイラは、下記のコードを正しく処理するために追加の設定を必要とします。

**メモ:** ES2015 クラスを使用した場合、一部のブラウザのスタックトレース上に、 CustomError コンストラクタが含まれます。


```js
class CustomError extends Error {
  constructor(foo = "bar", ...params) {
    // Pass remaining arguments (including vendor specific ones) to parent constructor
    super(...params);

    // Maintains proper stack trace for where our error was thrown (only available on V8)
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, CustomError);
    }

    this.name = "CustomError";
    // Custom debugging information
    this.foo = foo;
    this.date = new Date();
  }
}

try {
  throw new CustomError("baz", "bazMessage");
} catch (e) {
  console.error(e.name); //CustomError
  console.error(e.foo); //baz
  console.error(e.message); //bazMessage
  console.error(e.stack); //stacktrace
}
```


#### ES5 独自のエラーオブジェクト

**警告:** **すべて**のブラウザーのスタックトレース上に、 `CustomError` コンストラクターが含まれます。


```js
function CustomError(foo, message, fileName, lineNumber) {
  var instance = new Error(message, fileName, lineNumber);
  instance.name = "CustomError";
  instance.foo = foo;
  Object.setPrototypeOf(instance, Object.getPrototypeOf(this));
  if (Error.captureStackTrace) {
    Error.captureStackTrace(instance, CustomError);
  }
  return instance;
}

CustomError.prototype = Object.create(Error.prototype, {
  constructor: {
    value: Error,
    enumerable: false,
    writable: true,
    configurable: true,
  },
});

if (Object.setPrototypeOf) {
  Object.setPrototypeOf(CustomError, Error);
} else {
  CustomError.__proto__ = Error;
}

try {
  throw new CustomError("baz", "bazMessage");
} catch (e) {
  console.error(e.name); //CustomError
  console.error(e.foo); //baz
  console.error(e.message); //bazMessage
}
```

仕様書
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-error-objects |

ブラウザーの互換性
---------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

関連情報
----

* `throw`
* `try...catch`