- {string}
error.stack
属性是一个字符串,描述代码中 Error
被实例化的位置。
Error: Things keep happening!
at /home/gbusey/file.js:525:2
at Frobnicator.refrobulate (/home/gbusey/business-logic.js:424:21)
at Actor.<anonymous> (/home/gbusey/actors.js:400:8)
at increaseSynergy (/home/gbusey/actors.js:701:6)
第一行会被格式化为 <error class name>: <error message>
,且带上一系列栈帧(每一行都以 “at “ 开头)。
每一帧描述了一个代码中导致错误生成的调用点。
V8 引擎会试图显示每个函数的名称(变量名、函数名、或对象的方法名),但偶尔也可能找不到一个合适的名称。
如果 V8 引擎没法确定一个函数的名称,则只显示帧的位置信息。
否则,在位置信息的旁边会显示明确的函数名。
帧只由 JavaScript 函数产生。
例如,同步地执行一个名为 cheetahify
的 C++ 插件,且插件自身调用一个 JavaScript 函数,代表 cheetahify
回调的栈帧不会出现在堆栈跟踪里:
const cheetahify = require('./native-binding.node');
function makeFaster() {
// `cheetahify()` 同步地调用 speedy。
cheetahify(function speedy() {
throw new Error('oh no!');
});
}
makeFaster();
// will throw:
// /home/gbusey/file.js:6
// throw new Error('oh no!');
// ^
// Error: oh no!
// at speedy (/home/gbusey/file.js:6:11)
// at makeFaster (/home/gbusey/file.js:5:3)
// at Object.<anonymous> (/home/gbusey/file.js:10:1)
// at Module._compile (module.js:456:26)
// at Object.Module._extensions..js (module.js:474:10)
// at Module.load (module.js:356:32)
// at Function.Module._load (module.js:312:12)
// at Function.Module.runMain (module.js:497:10)
// at startup (node.js:119:16)
// at node.js:906:3
位置信息会是其中之一:
native
,帧表示一个 V8 引擎内部的调用(比如,[].forEach
)。plain-filename.js:line:column
,帧表示一个 Node.js 内部的调用。/absolute/path/to/file.js:line:column
,帧表示一个用户程序或其依赖的调用。
代表堆栈跟踪的字符串是在 error.stack
属性被访问时才生成的。
堆栈跟踪捕获的帧的数量是由 Error.stackTraceLimit
或当前事件循环中可用的帧数量的最小值界定的。