📜  什么是 stacktrace 以及如何在 node.js 中打印?(1)

📅  最后修改于: 2023-12-03 15:21:47.129000             🧑  作者: Mango

什么是 Stack Trace?

在编程过程中,当代码出现错误时,可用于快速识别问题的方法之一是调用堆栈跟踪(stack trace)。堆栈跟踪记录了代码运行过程中函数的调用顺序以及执行路径,以及导致错误的位置,它是一个非常有用的工具,可用于快速识别错误的根本原因,帮助程序员更快地解决问题。

如何在 Node.js 中打印 Stack Trace?

在 Node.js 中,当代码发生异常时,Node 会自动生成堆栈跟踪,并将其打印到控制台中。例如:

function foo() {
  throw new Error('Something wrong happened.');
}

function bar() {
  foo();
}

bar();

当我们运行这段代码时,控制台会打印如下所示的堆栈跟踪:

Error: Something wrong happened.
    at foo (/path/to/your/code/file.js:2:9)
    at bar (/path/to/your/code/file.js:6:3)
    at Object.<anonymous> (/path/to/your/code/file.js:8:1)
    at Module._compile (module.js:573:30)
    at Object.Module._extensions..js (module.js:584:10)
    at Module.load (module.js:507:32)
    at tryModuleLoad (module.js:470:12)
    at Function.Module._load (module.js:462:3)
    at Function.Module.runMain (module.js:609:10)
    at startup (bootstrap_node.js:158:16)

在这个例子中,我们在 foo 函数中抛出了一个 Error,并在 bar 函数中调用了它。然后我们在最顶层的 Object.<anonymous> 函数中调用了 bar。堆栈跟踪显示了这些调用的历史记录,每行都包含文件名,行号和函数名。

对于异步代码,堆栈跟踪可能会有所不同。异步操作有可能在当前函数调用结束后才开始,因此在堆栈跟踪中不会显示异步操作的调用顺序。但是 Node.js 可以通过设置环境变量 ASYNC_HOOK_TRACE_ENABLED 来跟踪异步操作的堆栈跟踪。例如:

process.env.ASYNC_HOOK_TRACE_ENABLED = true;

setTimeout(function() {
  throw new Error('Something wrong happened.');
}, 1000);

这将使 Node.js 在堆栈跟踪中包含异步操作的调用顺序。

结论

Stack Trace 可以帮助我们快速定位代码错误,是调试代码的一项非常有用的工具。在 Node.js 中,只需要让异常抛出即可获得堆栈跟踪。堆栈跟踪包含了函数调用顺序以及文件名,行号和函数名等信息,可以帮助开发者快速定位代码错误并解决问题。