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
構文を使用してエラーを処理してください:
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
}
仕様書
Specification |
---|
ECMAScript Language Specification # sec-error-objects |
ブラウザーの互換性
BCD tables only load in the browser