Error

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

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

解説

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

Errorシリアライズ可能オブジェクトなので、 structuredClone() で複製したり、ワーカー間で postMessage() を使用してコピーしたりすることができます。

エラーの型

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

EvalError

グローバル関数 eval() に関して発生するエラーを表すインスタンスを生成します。

RangeError

数値変数または引数が、その有効範囲外である場合に発生するエラーを表すインスタンスを生成します。

ReferenceError

不正な参照から参照先の値を取得した時に発生するエラーを表すインスタンスを生成します。

SyntaxError

構文エラーを表すインスタンスを生成します。

TypeError

変数または引数の型が有効でない場合に発生するエラーを表すインスタンスを生成します。

URIError

encodeURI() または decodeURI() に不正な引数が渡された時に発生するエラーを表すインスタンスを生成します。

AggregateError

処理から複数のエラーを報告する必要がある場合(例えば Promise.any() )に複数のエラーを単一のオブジェクトとして表現するインスタンスを生成します。

InternalError

"too much recursion" (深すぎる再帰) など、JavaScript エンジンで内部エラーが発生した時に発生するエラーを表すインスタンスを生成します。

コンストラクター

Error()

新しい Error オブジェクトを生成します。

静的メソッド

Error.captureStackTrace() 非標準

標準外の V8 の関数で、 Error インスタンスに stack プロパティを生成します。

Error.stackTraceLimit 非標準

標準外の V8 の数値プロパティで、エラーのスタックトレースに含めるスタックフレームの数を制限します。

Error.prepareStackTrace() 非標準 省略可

標準外の V8 の関数で、(ユーザーコードから提供された場合に)発生した例外に対して V8 Javascript エンジンによって呼び出され、ユーザーはスタックトレースを独自にフォーマットすることができます。

インスタンスプロパティ

これらのプロパティは Error.prototype で定義されており、すべての Error インスタンスで共有されます。

Error.prototype.constructor

このインスタンスオブジェクトを作成したコンストラクター関数です。 Error インスタンスの場合、初期値は Array コンストラクターです。

Error.prototype.name

エラーの名称を表します。Error.prototype.name の場合、初期値は "Error" です。 TypeErrorSyntaxError のようなサブクラスは各自の name プロパティを提供します。

Error.prototype.stack 非標準

スタックトレースのための非標準のプロパティ。

これらのプロパティはそれぞれの Error インスタンス自身のプロパティです。

cause

現在のエラーがなぜ発生したのかを示すエラーの原因。通常は捕捉した別のエラー。ユーザーが生成した Error オブジェクトでは、コンストラクターの第二引数で cause プロパティとして渡された値。

Error.prototype.columnNumber

標準外の Mozilla のプロパティで、このエラーが発生した行内の桁番号です。

Error.prototype.fileName

標準外の Mozilla のプロパティで、このエラーが発生したファイルへのパスです。

Error.prototype.lineNumber

標準外の Mozilla のプロパティで、このエラーが発生したファイル内の行番号です。

Error.prototype.message

エラーメッセージ。

インスタンスメソッド

Error.prototype.toString()

指定したオブジェクトを表す文字列を返します。Object.prototype.toString() メソッドを上書きします。

一般的なエラーを発生させる

通常、throw キーワードを使い意図的にエラーを発生させて Error オブジェクトを生成します。 try...catch 構文を使用してエラーを処理してください:

js
try {
  throw new Error("Whoops!");
} catch (e) {
  console.error(`${e.name}: ${e.message}`);
}

特定のエラーを処理する

instanceof でエラー型をテストすることにより、特定のエラー型だけを選んで処理できます:

js
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}`);
  }
  // など
  else {
    // いずれの場合にもマッチしない場合、Errorを未対処のままにする
    throw e;
  }
}

類似するエラーと区別する

異なる対処が必要な原因で失敗するにもかかわらず、コードブロックが非常によく似たエラー(すなわち同じ型やメッセージ)を投げることがあります。

発生した元のエラーが管理下にない場合、エラーを捕捉してより詳細なメッセージを持つ新しい Error オブジェクトを投げることが一つの選択肢となります。 元のエラーは新しい Error のコンストラクターの options パラメーターの cause プロパティに渡すべきです。これによって、上位の try/catch ブロックが元のエラーとスタックトレースを利用できることを保証します。

以下の例は、似たエラーで失敗する 2 つのメソッドを示しています(doFailSomeWay()doFailAnotherWay()):

js
function doWork() {
  try {
    doFailSomeWay();
  } catch (err) {
    throw new Error("Failed in some way", { cause: err });
  }
  try {
    doFailAnotherWay();
  } catch (err) {
    throw new Error("Failed in another way", { cause: err });
  }
}

try {
  doWork();
} catch (err) {
  switch (err.message) {
    case "Failed in some way":
      handleFailSomeWay(err.cause);
      break;
    case "Failed in another way":
      handleFailAnotherWay(err.cause);
      break;
  }
}

メモ: もしあなたがライブラリを制作しているなら、利用者にエラーメッセージをパースするようお願いするよりも発生したエラーを区別するために Error の cause を使用すべきです。例については Error の cause ページ をご覧ください。

サブクラスのコンストラクターが super() を呼び出すときに options パラメーターを渡せば、独自のエラー型cause プロパティを利用できます。基底クラスのコンストラクター Error()options.cause を読み取って、新しいエラーのインスタンスに cause プロパティを定義します。

js
class MyError extends Error {
  constructor(message, options) {
    // "cause" プロパティを設定するために第二引数に `options` を渡す必要がある。
    super(message, options);
  }
}

console.log(new MyError("test", { cause: new Error("cause") }).cause);
// Error: cause

独自のエラー型

Error から派生した独自のエラー型を定義して throw new CustomError() ができるようにし、instanceof CustomError で例外ハンドラー内のエラーの種類を確認したいでしょう。これを行う一般的な方法の実例を以下に示します。

StackOverflow の突っ込んだ議論、 "What's a good way to extend Error in JavaScript?" も参照してください。

警告: 組み込みのサブクラス化は、ES6 より古いコードに確実にトランスパイルできるわけではありません。なぜなら、 Reflect.construct() を使わずに特定の new.target を持つ基底クラスを構築する手段がないためです。追加の設定を行うか、コンストラクターの最後で Object.setPrototypeOf(this, CustomError.prototype) を手動で呼ぶ必要があります。そうしないと、構築されたインスタンスは CustomError のインスタンスになりません。詳しくは the TypeScript FAQ をご覧ください。

メモ: ES2015 クラスを使用した場合、一部のブラウザはスタックトレース上に CustomError コンストラクターを含めます。

js
class CustomError extends Error {
  constructor(foo = "bar", ...params) {
    // 親のコンストラクターに(ベンダー固有のものも含めて)残りの引数を渡す
    super(...params);

    // エラーが発生した箇所の正しいスタックトレースを維持する (V8でのみ有効)
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, CustomError);
    }

    this.name = "CustomError";
    // カスタムのデバッグ情報
    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
}

仕様書

Specification
ECMAScript Language Specification
# sec-error-objects

ブラウザーの互換性

BCD tables only load in the browser

関連情報