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

时间:2019-07-19 00:23:59

标签: javascript async-await es6-promise

请查看以下代码。第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'

3 个答案:

答案 0 :(得分:0)

最好的方法是这样做:

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

答案 1 :(得分:0)

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

正如您在问题中已经提到的那样,=VLOOKUP(D9,$B$2:$C$5,2,FALSE)-VLOOKUP(E9,$B$2:$C$5,2,FALSE) throw ex是唯一的方法。

当我在应用程序中使用Promise.reject(ex)时,通常这样做是为了摆脱async function链接并删除Promisethen。混用catch却用async functionPromisethen语法来称呼是很奇怪的。

实际上,我认为按照以下指示进行混合是危险的:JavaScript Promises - reject vs. throw

如果您沉迷于我,我想使用catchasync 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

答案 2 :(得分:0)

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

如果在异步函数中抛出,则返回的诺言将被拒绝。 如果您从异步函数返回(就像您在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 Async/Await Error Handling