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

構文

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

引数

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

説明

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

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

関数として使う

Error が new 演算子を用いない、通常の関数として使用された場合、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.log(e.name + ': ' + e.message);
}

特定のエラーを処理する

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

try {
  foo.bar();
} catch (e) {
  if (e instanceof EvalError) {
    console.log(e.name + ': ' + e.message);
  } else if (e instanceof RangeError) {
    console.log(e.name + ': ' + e.message);
  }
  // ... etc
}

独自のエラー型

Error から派生した独自のエラー型を定義して throw new CustomError() ができるようにし、instanceof CustomError で例外ハンドラー内のエラーの種類を確認したいでしょう。これを行う一般的な方法の実例を以下に示します。"What's a good way to extend Error in JavaScript?" discussion on Stackoverflow も参照してください。

ES6 独自のエラークラス

Babel は 独自のエラークラスのメソッドを使用することができますが、 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);
    }

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

try {
  throw new CustomError('baz', 'bazMessage');
} catch(e){
  console.log(e.foo); //baz
  console.log(e.message); //bazMessage
  console.log(e.stack); //stacktrace
}

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

prototype 宣言を使用した場合、すべてのブラウザのスタックトレース上に、CustomError コンストラクタが含まれます。

function CustomError(foo, message, fileName, lineNumber) {
  var instance = new Error(message, fileName, lineNumber);
  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.log(e.foo); //baz
  console.log(e.message) ;//bazMessage
}

仕様

仕様書 策定状況 備考
ECMAScript 1st Edition (ECMA-262) 標準 初期定義。JavaScript 1.1 で実装。
ECMAScript 5.1 (ECMA-262)
Error の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
Error の定義
標準  
ECMAScript Latest Draft (ECMA-262)
Error の定義
ドラフト  

ブラウザーの実装状況

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

凡例

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

関連情報

ドキュメントのタグと貢献者

このページの貢献者: segayuu, Marsf, lv7777, plonk, teoli, ethertank, Potappo, Hfjapancom
最終更新者: segayuu,