gpt4 book ai didi

Javascript 异步捕获调用者的错误

转载 作者:行者123 更新时间:2023-12-01 02:32:16 25 4
gpt4 key购买 nike

如果我将关键字async添加到函数中,似乎我必须捕获该函数“中”的错误。有时捕获错误是没有意义的,我想将它们推迟给调用者,因为我可能不知道调用该函数的上下文(例如调用者是否在执行 res.json(e) 或 next(e),或两者都没有)

有办法解决这个问题吗?所以我可以使用async(以便在函数内await)并将错误推迟给调用者?

这是一个非常人为的例子

https://codepen.io/anon/pen/OzEXwM?editors=1012

try {
function example(obj = {}) {
try {
obj.test = async () => { // if I remove async keyword, it works, otherwise I'm forced to catch errors here
//try{
throw new Error('example error') // I know `example outer error` won't catch as the returned object loses the context
//}catch(e){
// console.log('I do not want to catch error here'), I wan't to defer it to the caller
//}
}
return obj
} catch (e) {
console.log('example outer error')
}
}

let doit = example()
doit.test() // why doesn't 'outer error' catch this?

} catch (e) {
console.log('outer error')
}

按原样运行的脚本将给出未捕获的异常。但是,如果我删除 async 关键字,它就可以工作(是的,我知道在这个例子中,async 很愚蠢,这只是一个例子)

为什么调用doit.test()时无法捕获错误?

通常情况下,我只会遵守并返工,但在今天早上试图向其他人解释时,我意识到,我真的不知道答案。

最佳答案

Why can't I catch the error when doit.test() is called?

因为它是异步的。当到达抛出错误部分时,外部的 try catch block 已经被执行并通过。可以这么说,没有什么可扔的。

要解决这个问题,因为 async 和 wait 只是 Promise 的语法糖,你只需使用它的 catch callback 。您的 test() 函数将返回一个 Promise,因此只需将回调添加到返回的 Promise

doit.test().catch(()=>{ 
console.log('Any uncaught exceptions will be sent to here now');
});

演示

function example(obj = {}) {
obj.test = async() => {
throw new Error('example error')
}
return obj;
}

let doit = example()
doit.test().catch(e => {
console.log('Caught an exception: ', e.message);
});

关于Javascript 异步捕获调用者的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48231066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com