Error

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

構文

new Error([message[, fileName[, lineNumber]]])

引数

message
人間が読めるエラーの説明。
fileName Optional
生成された Error オブジェクト上の fileName プロパティに設定される値。デフォルトでは、Error() コンストラクターを呼び出したコードを含むファイルの名前。
lineNumber Optional
生成された Error オブジェクト上の lineNumber プロパティに設定される値。デフォルトでは、Error() コンストラクターの呼び出しを含む行番号。

説明

ランタイムエラーが発生すると、新しい Error オブジェクトが生成され、投げられます。

このページは、Error オブジェクト自体の使い方と、それをコンストラクター関数として使うことについて書かれています。Error インスタンスに継承されるプロパティとメソッドのリストについては、Error.prototype を参照してください。

関数として使う

Errornew 演算子を用いずに、通常の関数として使用された場合、Error オブジェクトを返します。よって、単に Error を呼び出した場合も、new 演算子を使用した場合と同等の挙動となります。

// this:
const x = Error('I was created using a function call!');
​​​​// has the same functionality as this:
const y = new Error('I was constructed via the "new" keyword!');

エラーの型

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

EvalError
グローバル関数 eval() に関して発生するエラーを表すインスタンスを生成します。
InternalError
"too much recursion" (過剰な再帰) など、JavaScript エンジンで内部エラーが投げられた時に発生するエラーを表すインスタンスを生成します。
RangeError
数値変数または引数が、その有効範囲外である場合に発生するエラーを表すインスタンスを生成します。
ReferenceError
不正な参照から参照先の値を取得した時に発生するエラーを表すインスタンスを生成します。
SyntaxError
eval() 内のコードの解釈中に発生する構文エラーを表すインスタンスを生成します。
TypeError
変数または引数の型が有効でない場合に発生するエラーを表すインスタンスを生成します。
URIError
encodeURI() または decodeURI() に不正な引数が渡された時に発生するエラーを表すインスタンスを生成します。

プロパティ

Error.prototype
Error インスタンスにプロパティを追加できます。

メソッド

グローバルな Error オブジェクトは、自分自身のメソッドを持っていませんが、プロトタイプチェーンを通していくつかのメソッドを継承しています。

Error インスタンス

すべての Error インスタンスと non-generic errors のインスタンスは Error.prototype から継承します。すべてのコンストラクター関数と同様に、このコンストラクターの prototype を使用して、プロパティやメソッドをこのコンストラクターで生成されたすべてのインスタンスに追加できます。

プロパティ

標準プロパティ

Error.prototype.constructor
インスタンスのプロトタイプを生成した関数を指定します。
Error.prototype.message
エラーメッセージ。
Error.prototype.name
エラーの名称。

ベンダー独自の拡張

非標準
この機能は標準ではなく、標準化の予定もありません。公開されているウェブサイトには使用しないでください。ユーザーによっては使用できないことがあります。実装ごとに大きな差があることもあり、将来は振る舞いが変わるかもしれません。

Microsoft

Error.prototype.description
エラーの説明。message と類似。
Error.prototype.number
エラー番号。

Mozilla

Error.prototype.fileName
このエラーを起こしたファイルへのパス。
Error.prototype.lineNumber
このエラーを起こしたファイル内の行番号。
Error.prototype.columnNumber
このエラーを起こした行内の列番号。
Error.prototype.stack
スタックトレース。

メソッド

Error.prototype.toSource()
指定した Error オブジェクトのソースを含む文字列を返します。この値を新しいオブジェクトの生成に利用できます。Object.prototype.toSource() メソッドを上書きします。
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 独自のエラーオブジェクト

prototype 宣言を使用した場合、すべてのブラウザーのスタックトレース上に、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 Latest Draft (ECMA-262)
Error の定義
ドラフト
ECMAScript 2015 (6th Edition, ECMA-262)
Error の定義
標準
ECMAScript 5.1 (ECMA-262)
Error の定義
標準
ECMAScript 1st Edition (ECMA-262) 標準 初回定義。JavaScript 1.1 で実装。

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
ErrorChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 6Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 1.0nodejs 完全対応 あり
columnNumber
非標準
Chrome 未対応 なしEdge 未対応 なしFirefox 完全対応 1IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 未対応 なしChrome Android 未対応 なしFirefox Android 完全対応 4Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 未対応 なし
fileName
非標準
Chrome 未対応 なしEdge 未対応 なしFirefox 完全対応 1IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 未対応 なしChrome Android 未対応 なしFirefox Android 完全対応 4Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 未対応 なし
lineNumber
非標準
Chrome 未対応 なしEdge 未対応 なしFirefox 完全対応 1IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 未対応 なしChrome Android 未対応 なしFirefox Android 完全対応 4Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 未対応 なし
messageChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 6Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 1.0nodejs 完全対応 あり
nameChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 6Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 1.0nodejs 完全対応 あり
prototypeChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 6Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 1.0nodejs 完全対応 あり
stack
非標準
Chrome 完全対応 3Edge 完全対応 12Firefox 完全対応 1IE 完全対応 10Opera 完全対応 ありSafari 完全対応 6WebView Android 完全対応 ≤37Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 6Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
toSource
非標準
Chrome 未対応 なしEdge 未対応 なしFirefox 完全対応 1IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 未対応 なしChrome Android 未対応 なしFirefox Android 完全対応 4Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 未対応 なし
toStringChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 6Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 1.0nodejs 完全対応 あり

凡例

完全対応  
完全対応
未対応  
未対応
非標準。ブラウザー間の互換性が低い可能性があります。
非標準。ブラウザー間の互換性が低い可能性があります。

関連情報