Error

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

解説

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

エラーの型

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

EvalError
グローバル関数 eval() に関して発生するエラーを表すインスタンスを生成します。
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 構文を使用してエラーを処理してください:

try {
  throw new Error('Whoops!')
} catch (e) {
  console.error(e.name + ': ' + e.message)
}

特定のエラーを処理する

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

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 コンストラクタが含まれます。

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 コンストラクターが含まれます。

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
}

仕様書

仕様書
ECMAScript (ECMA-262)
Error の定義

ブラウザーの互換性

BCD tables only load in the browser

関連情報