JavaScript

Error.prototype.stackプロパティ

 編集:2022.08.07 by T.A.

[Edge]非標準。→

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

構文
Error.stack
Error Error

¶String。呼び出された関数のトレース、つまり、その呼び出し順、呼び出したファイルの行番号、呼び出した関数の引数を提供します。スタック文字列は、最後の呼び出しから最初の呼び出しへ進み、元のグローバル スコープの呼び出しまで遡ります。

解説

各ステップは改行で区切られ、行の先頭は関数名(グローバル スコープからの呼び出しでない場合)、次に @ 記号、ファイルの場所(エラーが投げられている時に関数がエラー コンストラクターである場合を除く)、コロン記号、ファイルの場所がある場合は行番号の順に続きます。(ただし、Error オブジェクトも、投げられたエラーから取り戻すため fileName および lineNumber、columnNumber プロパティを所有することに注意してください。これはエラーのみであり、そのトレースではありません。)

これは Firefox だけで使用される書式であることに注意してください。スタック トレースに標準の書式はありません。しかし、Safari 6 以降と Opera 12 以前ではとてもよく似た書式を使用します。一方で、V8 JavaScript エンジンを搭載したブラウザー(Chrome、Opera 15 以降、Android Browser など)や IE 10 以降のブラウザーは異なる書式を使用します(アーカイブされたMSDN の error.stack ドキュメントを参照)。

スタック上の引数の値: Firefox 14 以前(バグ 744842)で、関数名は、文字列に変換され括弧で囲まれた引数の値に続き、@ 記号の直前に置かれます。オブジェクト(または配列等)は変換された形式 "[object Object]" で現れるため、これが実際のオブジェクトに戻され評価されることはありません。スカラー値を受け取ります(それにも関わらず、少なくとも Firefox 14 では可能です。arguments.callee.caller.arguments を使用し、arguments.callee.caller.name により、簡単に関数名を取り戻すことが可能です)。"undefined" は、"(void 0)" として記録されます。ただし、"@"、"(", ")"(または、これらがファイル名に含まれる場合)を伴う文字列引数が渡された場合、行がそのコンポーネント部分で分かれてしまうため、これらに安易に頼ることができません。従って、Firefox 14 以降では、これが少なからず問題になります。

ブラウザによって値を設定するタイミングが異なります。例えば Firefox は、これを Error オブジェクトが作成された時に設定し、PhantomJS は、Error が投げられた時にのみ設定します。アーカイブされた MSDN のドキュメント によれば、PhantomJS の実装とも一致するようです。

stack プロパティの使用
次の HTML マークアップは、stack プロパティの使用を実演します。
<!DOCTYPE HTML>
<meta charset="UTF-8">
<title>Stack Trace Example</title>
<body>
<script>
function trace() {
  try {
    throw new Error('myError');
  }
  catch(e) {
    alert(e.stack);
  }
}
function b() {
  trace();
}
function a() {
  b(3, 4, '\n\n', undefined, {});
}
a('first call, firstarg');
</script>

上記のマークアップは、Windows ファイルシステム上の C:\example.html に保存されているものと仮定します。これは、次のテキストを含む警告メッセージを生成します:

Firefox 30 以降では、列番号が含まれます。

trace@file:///C:/example.html:9:17
b@file:///C:/example.html:16:13
a@file:///C:/example.html:19:13
@file:///C:/example.html:21:9

Firefox 14 から Firefox 29 まで:

trace@file:///C:/example.html:9
b@file:///C:/example.html:16
a@file:///C:/example.html:19
@file:///C:/example.html:21

Firefox 13 以前は、代わりに次のテキストが生成されます。

Error("myError")@:0
trace()@file:///C:/example.html:9
b(3,4,"\n\n",(void 0),[object Object])@file:///C:/example.html:16
a("first call, firstarg")@file:///C:/example.html:19
@file:///C:/example.html:21

¶省く


テスト