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;
}
仿§æ¸
仿§æ¸ã«å«ã¾ãã¦ãã¾ããã
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- TraceKit (GitHub)
- stacktrace.js (GitHub)
- Stack trace API (V8 docs)