在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