Error.prototype.stack
非標準: この機能は標準化されていません。非標準の機能はブラウザーの対応が限られ、将来的に変更または削除される可能性があるため、本番環境での使用は推奨されません。ただし、標準の選択肢が存在しない特定のケースでは、有効な代替手段となる場合があります。
メモ:
stack プロパティは事実上、主要な JavaScript エンジンすべてで実装されており、JavaScript 標準化委員会はこれを標準化しようとしています。実装の不一致によりスタック文字列の正確な内容に依存することはできませんが、一般的に存在すると仮定し、デバッグ目的で使用できます。
stack は Error インスタンスの標準外のプロパティで、呼び出された関数のトレース、つまり、その呼び出し順、呼び出したファイルの行番号、呼び出した関数の引数を提供します。スタック文字列は、最後の呼び出しから最初の呼び出しへ進み、元のグローバルスコープの呼び出しまで遡ります。
値
文字列です。
stack プロパティは標準外であるため、実装によってその実装先が異なります。
- Firefox では、
Error.prototypeのアクセサープロパティです。 - Chrome および Safari では、それぞれの
Errorインスタンスのデータプロパティであり、記述子は次のとおりです。
Error.prototype.stack のプロパティ属性 | |
|---|---|
| 書込可能 | 可 |
| 列挙可能 | 不可 |
| 設定可能 | 可 |
解説
それぞれの JavaScript エンジンは独自の形式でスタックトレースを出力しますが、高レベルな構造は概ね一貫しています。すべての実装では、スタック内の各行が個別の関数呼び出しを表します。エラーを直接引き起こした呼び出しは最上部に配置され、呼び出しチェーン全体を開始した呼び出しは最下部に配置されます。以下にスタックトレースの例を示します。
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
#### JavaScriptCore
baz@filename.js:10:24
bar@filename.js:6:6
foo@filename.js:2:6
global code@filename.js:13:4
#### SpiderMonkey
baz@filename.js:10:15
bar@filename.js:6:3
foo@filename.js:2:3
@filename.js:13:1
#### V8
Error
at baz (filename.js:10:15)
at bar (filename.js:6:3)
at foo (filename.js:2:3)
at filename.js:13:1
V8 は、スタックトレースをカスタマイズするための標準外のスタックトレース API を提供しています。これにはError.captureStackTrace()、Error.stackTraceLimit、Error.prepareStackTrace() が含まれます。他のエンジンもこの API に様々な程度で対応していましたが、
エンジンによってこの値を設定するタイミングは異なります。ほとんどの現代のエンジンでは、Error オブジェクトが作成された時点で設定されます。つまり、関数内で以下の方法を使用して完全なコールスタック情報を取得できます。
function foo() {
console.log(new Error().stack);
}
throw したり捕捉したりしません。
スタックフレームは明示的な関数呼び出し以外にも存在します。例えば、イベントリスナー、タイムアウトジョブ、プロミスハンドラーはそれぞれ独自の呼び出しチェーンを開始します。 eval() および Function コンストラクター呼び出し内のソースコードもスタックに現れます。
console.log(new Function("return new Error('Function failed')")().stack);
console.log("====");
console.log(eval("new Error('eval failed')").stack);
#### JavaScriptCore
anonymous@
global code@filename.js:1:65
====
eval code@
eval@[native code]
global code@filename.js:3:17
#### SpiderMonkey
anonymous@filename.js line 1 > Function:1:8
@filename.js:1:65
====
@filename.js line 3 > eval:1:1
@filename.js:3:13
#### V8
Error: Function failed
at eval (eval at <anonymous> (filename.js:1:13), <anonymous>:1:8)
at filename.js:1:65
====
Error: eval failed
at eval (eval at <anonymous> (filename.js:3:13), <anonymous>:1:1)
at filename.js:3:13
Firefox では、//# sourceURL ディレクティブを使用して eval ソースに名前を付けることができます。Firefox の eval ソースのデバッグのドキュメントを参照してください。
例
>stack プロパティの使用
以下のスクリプトは、stack プロパティを使用してスタックトレースをブラウザーウィンドウに出力する方法を示しています。これにより、ブラウザーのスタック構造がどのように見えるかを確認できます。
function trace() {
throw new Error("trace() failed");
}
function b() {
trace();
}
function a() {
b(3, 4, "\n\n", undefined, {});
}
try {
a("first call, first arg");
} catch (e) {
document.getElementById("output").textContent = e.stack;
}
仕様書
仕様書に含まれていません。
ブラウザーの互換性
Loading…
関連情報
- TraceKit (GitHub)
- stacktrace.js (GitHub)
- Stack trace API (V8 docs)