取如下代码:
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)
....
这就是.cause
error属性(更多细节请参阅旧提案页面)的含义:
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);
}