Error コンストラクターは、エラーオブジェクトを生成します。 Error オブジェクトのインスタンスは、ランタイムエラーが発生した時に投げられます。Error オブジェクトは、ユーザー定義の例外の基底オブジェクトとして使用することもできます。標準の組み込みエラー型については下記を参照してください。
構文
new Error([message[, fileName[, lineNumber]]])
引数
message- 人間が読めるエラーの説明。
fileNameOptional- 生成された
Errorオブジェクト上のfileNameプロパティに設定される値。デフォルトでは、Error()コンストラクターを呼び出したコードを含むファイルの名前。 lineNumberOptional- 生成された
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- 不正な参照から参照先の値を取得した時に発生するエラーを表すインスタンスを生成します。
SyntaxErroreval()内のコードの解釈中に発生する構文エラーを表すインスタンスを生成します。TypeError- 変数または引数の型が有効でない場合に発生するエラーを表すインスタンスを生成します。
URIErrorencodeURI()またはdecodeURI()に不正な引数が渡された時に発生するエラーを表すインスタンスを生成します。
プロパティ
Error.prototypeErrorインスタンスにプロパティを追加できます。
メソッド
グローバルな 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 (ECMA-262) Error の定義 |
現行の標準 | |
| ECMAScript 2015 (6th Edition, ECMA-262) Error の定義 |
標準 | |
| ECMAScript 5.1 (ECMA-262) Error の定義 |
標準 | |
| ECMAScript 1st Edition (ECMA-262) | 標準 | 初回定義。JavaScript 1.1 で実装。 |
ブラウザーの互換性
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Error | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 6 | Opera 完全対応 4 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
Error() constructor | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 6 | Opera 完全対応 4 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
columnNumber | Chrome 未対応 なし | Edge 未対応 なし | Firefox 完全対応 1 | IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 完全対応 4 | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
fileName | Chrome 未対応 なし | Edge 未対応 なし | Firefox 完全対応 1 | IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 完全対応 4 | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
lineNumber | Chrome 未対応 なし | Edge 未対応 なし | Firefox 完全対応 1 | IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 完全対応 4 | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
message | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 6 | Opera 完全対応 5 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
name | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 6 | Opera 完全対応 4 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
stack | Chrome 完全対応 3 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 10 | Opera 完全対応 10.5 | Safari 完全対応 6 | WebView Android 完全対応 ≤37 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 11 | Safari iOS 完全対応 6 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
toSource | Chrome 未対応 なし | Edge 未対応 なし | Firefox
完全対応
1
| IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 完全対応 4 | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
toString | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 6 | Opera 完全対応 4 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 実装ノートを参照してください。
- 実装ノートを参照してください。