isa*_*acs 569
任何Error
对象都有一个stack
成员,它可以捕获构造它的点.
var stack = new Error().stack
console.log( stack )
Run Code Online (Sandbox Code Playgroud)
或更简单地说:
console.trace("Here I am!")
Run Code Online (Sandbox Code Playgroud)
Mar*_*wak 186
console.trace()
Run Code Online (Sandbox Code Playgroud)
Zan*_*non 87
如前所述,您只需使用trace命令:
console.trace("I am here");
Run Code Online (Sandbox Code Playgroud)
但是,如果您在搜索有关如何记录异常的堆栈跟踪的问题时,可以只记录Exception对象.
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
Run Code Online (Sandbox Code Playgroud)
它会记录:
错误:发生了意外情况.
at对象的主要(c:\ Users\Me\Documents\MyApp\app.js:9:15)
.(c:\ Users\Me\Documents\MyApp\app.js:17:1)
在Module._compile(module.js:460:26)
处于Object.Module._extensions..js(module.js:478:10) )
在Module.load(module.js:355:32)
的Function.Module._load(module.js:310:12)上,
在Function.Module.runMain(module.js:501:10)
启动时(node.js) :129:16)
在node.js:814:3
如果Node.js版本小于6.0.0,则记录Exception对象是不够的.在这种情况下,它只会打印:
[错误:发生意外事件.]
对于节点版本<6,使用console.error(e.stack)
而不是console.error(e)
打印错误消息加上完整堆栈,就像当前节点版本一样.
注意:如果将异常创建为类似字符串throw "myException"
,则无法检索堆栈跟踪并且记录e.stack
产量未定义.
为了安全起见,您可以使用
console.error(e.stack || e);
Run Code Online (Sandbox Code Playgroud)
它适用于新旧Node.js版本.
ruX*_*ruX 37
以Error
更易读的方式打印控制台中的堆栈跟踪:
console.log(ex, ex.stack.split("\n"));
Run Code Online (Sandbox Code Playgroud)
示例结果:
[Error] [ 'Error',
' at repl:1:7',
' at REPLServer.self.eval (repl.js:110:21)',
' at Interface.<anonymous> (repl.js:239:12)',
' at Interface.EventEmitter.emit (events.js:95:17)',
' at Interface._onLine (readline.js:202:10)',
' at Interface._line (readline.js:531:8)',
' at Interface._ttyWrite (readline.js:760:14)',
' at ReadStream.onkeypress (readline.js:99:10)',
' at ReadStream.EventEmitter.emit (events.js:98:17)',
' at emitKey (readline.js:1095:12)' ]
Run Code Online (Sandbox Code Playgroud)
小智 10
在 v15.12.0 中,有多种方法可以执行此操作,
1. console.trace(anything)
2. Error.captureStackTrace(Object)
3. console.log(new Error().stack)
4. Try Catch - Use console.log(e), where `e` is catched by catch block
Run Code Online (Sandbox Code Playgroud)
或者更好地 在任何 Javascript 代码中使用stacktracejs
通过一个随时可用的Node模块,可以从Node获得全长堆栈跟踪(尽管性能损失很小):http: //www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack -traces换节点-JS
@isaacs答案是正确的,但如果您需要更具体或更清晰的错误堆栈,您可以使用此功能:
function getCleanerStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
Run Code Online (Sandbox Code Playgroud)
这个函数的灵感直接来自NodeJS 中的console.trace
函数。
尝试Error.captureStackTrace(targetObject[, constructorOpt])。
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
Run Code Online (Sandbox Code Playgroud)
函数a
和b
被捕获在错误堆栈中并存储在myObj
.