繁体   English   中英

如何在不重新引发错误或不使用Promise.reject的情况下捕获来自异步函数的错误?

[英]How to ensure an error from an async function is captured without rethrowing the error or using Promise.reject?

请看下面的代码。 第5行: return ex

当我调用myFunc ,我希望在控制台中看到'err' ,但是我看到'yes' ,这意味着在myFunc之外未捕获该错误。 该错误没有冒泡。

这是有道理的,因为我没有抛出错误: throw ex或使用Promise.reject(ex)

我的问题是:如何确保不使用上述两种方法就将错误捕获到我的函数之外? 有办法吗?

async function myFunc() {
    try {
        throw new Error();
    } catch (ex) {
        return ex;
    }
}

myFunc().then(() => console.log('yes')).catch(() => console.log('err'))
// 'yes'

最好的方法是这样做:

async function myFunc() {
    try {
        throw new Error();
    } catch (ex) {
        throw ex;
    }
}

我试图回答这个问题,但最终重写了我的整个答案。 有一次,我删除了答案。

正如您在问题中已经说过的那样, throw exPromise.reject(ex)是唯一的方法。

当我在应用程序中使用async function时,通常将其作为从Promise链接迁移并删除then catch 混合使用async functionthenPromise调用它, then catch语法,这确实很奇怪。

实际上,我认为按如下所示进行混合是很危险的: JavaScript Promises-拒绝与抛出

如果您沉迷于我,我想使用async function重写您的呼叫者并await

 async function myFunc() { throw new Error("Some Error!"); } ( async function () { try { await myFunc(); console.log("yes"); } catch (err) { console.log("err: ", err.message); } } )(); 

此语法类似于它的同步对应项,后者推断我们应该使用throw

 function myFunc() { throw new Error("Some Error!"); } ( function () { try { myFunc(); console.log("yes"); } catch (err) { console.log("err: ", err.message); } } )(); 

使用异步功能时,您可以使用普通的javascript try / catch处理错误。

如果在异步函数中抛出,则它返回的promise将被拒绝。 如果您从异步函数返回(如您在catch块中所做的那样),则将使用返回的值(在您的情况下为例外)来解析promise

这是两个示例,说明如何处理可能引发的异步函数:

 // async function that might throw async function funcThatThrows() { throw new Error("IT THROWS!"); } // Exception Handling in other async functions async function example1() { try { let result = await funcThatThrows(); /* ... */ } catch(e) { console.log("example1:", e.message); } } // Exception handling in non-async functions function example2() { funcThatThrows() .then(result => { /* ... */ }) .catch(err => console.log("example2:", err.message)); } example1(); example2(); 

有关异步错误处理的详细教程,请参见Javascript异步/等待错误处理:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM