如何在try catch错误链上添加信息,以获得全面的堆栈跟踪?



取如下代码:

try {
try {
try {
throw new Error(`ERR00`)
} catch (error) {
throw new Error(`ERR01`)
}
} catch (error) {
throw new Error(`ERR03`)
}
} catch (error) {
console.log(error, (error as Error).stack);
}

堆栈输出将只报告最外部的错误(最顶层),而不报告错误链。

现在想象这个错误链发生在不同的地方func03调用func02调用func01否则,解决方案可能很简单,将所有内容包装在一个trycatch中。

Stack将只报告func03的错误,并且不会直接回溯错误。没有额外的日志记录。

:

Error: ERR00
at Object.<anonymous> (/[...]/test.ts:4:15)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Module.m._compile (/usr/local/lib/node_modules/ts-node/src/index.ts:858:23)
at Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Object.require.extensions.<computed> [as .ts] (/usr/local/lib/node_modules/ts-node/src/index.ts:861:12)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:790:12)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
at main (/usr/local/lib/node_modules/ts-node/src/bin.ts:227:14)
at Object.<anonymous> (/usr/local/lib/node_modules/ts-node/src/bin.ts:513:3) Error: ERR00
at Object.<anonymous> (/Users/nicola.aretini/Documents/github/nms-backend-services/nms.productful/test.ts:43:15)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Module.m._compile (/usr/local/lib/node_modules/ts-node/src/index.ts:858:23)
at Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Object.require.extensions.<computed> [as .ts] (/usr/local/lib/node_modules/ts-node/src/index.ts:861:12)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:790:12)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
at main (/usr/local/lib/node_modules/ts-node/src/bin.ts:227:14)
at Object.<anonymous> (/usr/local/lib/node_modules/ts-node/src/bin.ts:513:3)

您建议如何使用Error类来正确填充堆栈跟踪?

获取如下内容:

Error: ERR03
at Object.<anonymous> (/[...]/test.ts:4:15)
Error: ERR02
at Object.<anonymous> (/[...]/test.ts:6:15)
Error: ERR01
at Object.<anonymous> (/[...]/test.ts:8:15)
....

这就是.causeerror属性(更多细节请参阅旧提案页面)的含义:

try {
try {
try {
throw new Error(`ERR00`)
} catch (error) {
throw new Error(`ERR01`, {cause: error})
}
} catch (error) {
throw new Error(`ERR03`, {cause: error})
}
} catch (error) {
console.error(error);
}

最新更新