在Nodejs中记录printstack跟踪的多种方法

901 阅读2分钟

在Nodejs中,有多种方法来打印错误的堆栈跟踪。

当nodejs的javascript引擎出现意外错误时,会显示堆栈跟踪。它可以帮助开发人员调试和解决这些问题。

堆栈跟踪给出了一个方法行号调用堆栈跟踪,以后进先出(LIFO)。

如何在Nodejs中打印错误的堆栈跟踪?

在javascript和nodejs中,我们有多种方法可以做到

  • 使用try和catch

try和catch是用来捕捉异常的代码。

代码被包裹在try块中 下面是一个javascript中try catch的例子

try {
    throw new Error("Custom Error");
} catch (error) {
    console.log(error);
}

输出:

A:\work\nodework>node error.js
Error: Custom Error
    at Object.<anonymous> (A:\work\nodework\error.js:11:11)
    at Module._compile (internal/modules/cjs/loader.js:1068:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
    at Module.load (internal/modules/cjs/loader.js:933:32)
    at Function.Module._load (internal/modules/cjs/loader.js:774:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47
  • 错误堆栈属性

stack 属性包含堆栈跟踪的字符串版本。

stack属性包含了一个叫trace的方法的堆栈跟踪,以LIFO的顺序。

首先,创建一个Error对象,然后object.stack返回字符串。

console.log(new Error("custom error").stack)
  • 控制台跟踪功能

javascript中的控制台对象提供了各种功能来记录信息、调试和错误信息。

trace() 控制台中的方法记录了一个给定请求的方法调用的堆栈跟踪。

语法

console.trace(new Error("My Error"));

输出:

A:\work\nodework>node error.js
Trace: Error: My Error
    at Object.<anonymous> (A:\work\nodework\error.js:16:15)
    at Module._compile (internal/modules/cjs/loader.js:1068:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
    at Module.load (internal/modules/cjs/loader.js:933:32)
    at Function.Module._load (internal/modules/cjs/loader.js:774:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47
    at Object.<anonymous> (A:\work\nodework\error.js:16:9)
    at Module._compile (internal/modules/cjs/loader.js:1068:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
    at Module.load (internal/modules/cjs/loader.js:933:32)
    at Function.Module._load (internal/modules/cjs/loader.js:774:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47
  • 使用处理unhandledRejection事件

在Nodejs应用程序中,在进程对象上有一个全局事件unhandledRejection,可以写入处理错误和承诺错误的链中。

process.on('unhandledRejection', function(err, promise) {
    console.error('Unhandled rejection',error);
});
or 

process.on('unhandledRejection', ((err,promise) => {
    console.error('Unhandled rejection',error);
});

  • 在错误中使用captureStackTrace函数

Error captureStackTrace函数为目标对象添加一个堆栈属性,返回堆栈跟踪的字符串。

const myemp = { "id": 11, "name": "Eric" };
Error.captureStackTrace(myemp);
console.log(myemp.stack);

输出:

A:\work\nodework>node error.js
john
    at Object.<anonymous> (A:\work\nodework\error.js:2:7)
    at Module._compile (internal/modules/cjs/loader.js:1068:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
    at Module.load (internal/modules/cjs/loader.js:933:32)
    at Function.Module._load (internal/modules/cjs/loader.js:774:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47