首页 > 解决方案 > 如何确保在不重新抛出错误或使用 Promise.reject 的情况下捕获异步函数的错误?

问题描述

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

当我打电话时myFunc,我希望'err'在控制台中看到,但我看到'yes'这意味着myFunc没有捕获外部错误。错误没有冒泡。

这是有道理的,因为我不会重新抛出错误 do:throw ex或 using Promise.reject(ex).

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

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

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

标签: javascriptasync-awaites6-promise

解决方案


使用异步函数时,您可以使用普通的 javascripttry / catch来处理错误。

如果你在异步函数中抛出,它返回的承诺将被拒绝。如果您从异步函数返回(就像您在catch块中所做的那样),则承诺将使用返回的值解决(在您的情况下是例外)

这里有两个示例如何处理可能抛出的异步函数:

// 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 错误处理 :)


推荐阅读