假设我有12个async/await
函数,并且在12日深处,会发生错误。现在,我有这个代码来捕获所有错误:
process.on('unhandledRejection', function {
console.error(err);
process.exit(1);
});
问题是,不会返回堆栈跟踪:
ReferenceError: sdfg is not defined
- get.js:29 Fruit.module.exports [as get]
/project/models/fruit/get.js:29:2
- next_tick.js:129 process._tickDomainCallback
internal/process/next_tick.js:129:7
在其他项目中,当我使用结构为:
的回调时function doSomething(err, done) {
if (err) { return done(err); }
/* do something */
return done(null, true);
}
然后我有一个很好的堆栈跟踪错误发生的位置和导致那里的步骤。现在使用async/await
我尝试在各种级别捕获错误而没有结果。我还尝试了longjohn
和stackup
- 我仍然只获得了抛出错误的最后一个函数。
帮助 - 如何查看完整的堆栈?!什么是捕获嵌套异步/等待错误的正确方法?
编辑:(完整示例)
const getA = async () => {
await getB();
}
const getB = async () => {
await getC();
sdgf();
}
const getC = async () => {}
const start = async () => {
await getA();
}
start().then().catch(e => console.error(e));
答案 0 :(得分:1)
unhandledRejection
错误处理程序可能不是尝试捕获所有这些的正确方法。我建议在try / catch块中包装你的async / awaits:
async function doSomething() {
try {
await doSomethingElse()
} catch(err) {
console.log(err)
}
}
这可以为您提供更好的堆栈跟踪。
答案 1 :(得分:0)
从今天开始,在异步函数中的第一个await语句之后,无法获得堆栈跟踪。
答案 2 :(得分:0)
此问题似乎已在节点12中得到解决。使用v12.6.0
,原始帖子中的代码段将产生以下堆栈跟踪:
ReferenceError: sdgf is not defined
at getB (/path/to/test.js:7:3)
at async getA (/path/to/test.js:2:3)
at async start (/path/to/test.js:15:3)