当前位置: 首页 > 知识库问答 >
问题:

为什么在异步函数中捕获后仍然抛出异常?

颛孙航
2023-03-14

当捕获异常时,其余代码仍会执行。

function bad(){
    //throw new Error('I am an exception')
    return Promise.reject("I am an exception")
}

(
 async function (){
      let  msg = await bad().catch( e=>console.log("This is an error: " + e))
      console.log("I want to stop before executing this line ")
 }
)()

我试图用这种方式来捕捉异常,而不是尝试捕捉

我的第一个问题是如何在错误被捕获后阻止代码到达其余代码。

第二个问题是,如果我将Promise reject替换为注释掉的抛出错误,抛出的异常错误将不会被捕获,这是为什么?

共有1个答案

毕黎昕
2023-03-14

因为您正在使用您的catch处理程序将拒绝转换为履行。wait将等待catch返回的promise,它永远不会拒绝。因此,代码没有理由不继续,因为wait只看到已履行(从未拒绝)的promise。

记住,catch返回一个新的promise,该promise将根据拒绝处理程序的操作来解决。拒绝处理程序通过有效返回<code>undefined

这就好像你这样做了:

async function (){
    let msg;
    try {
        msg = await bad();
    } catch (e) {
        console.log("This is an error: " + e);
    }
    console.log("I want to stop before executing this line ")
}

在你问的评论中:

因此,除了在try块中包含我的所有代码之外,没有其他方法,只能使用一行代码<code>。catch()如果我没有更多的代码可以遵循?

简单说一下:通常,除了代码的顶级入口点之外,最好不要在任何函数中处理错误(例如,在代码的顶级调用的函数或由事件处理程序调用的函数)。过早处理错误是典型的反模式。允许它们传播到调用者,在调用者那里它们可以被集中处理。

但是,在适合在此级别处理错误的情况下,是的,尝试/捕获可能是您在try块中的以下逻辑的最佳选择:

async function() {
     try {
         let msg = await bad();
         console.log("I want to stop before executing this line ")
     } catch (e) {
         console.log("This is an error: " + e);
     }
}

它还有一个优点,就是没有在不打算使用的包含范围内声明变量。如果“一行代码”对您来说很重要,那么< code >和< code >之间没有太大的区别。catch和< code>catch:

async function() {
     try {
         let msg = await bad();
         console.log("I want to stop before executing this line ")
     } catch (e) { console.log("This is an error: " + e); }
}

或者您可以返回某种标志值:

async function() {
     let msg = await bad().catch(e => { console.log("This is an error: " + e); return null; });
     if (msg === null) {
         return;
     }
     console.log("I want to stop before executing this line ")
}

但坦率地说,这真的逆流而上。:-)

 类似资料:
  • 在try块中为未抛出异常子类的方法捕获异常,将无法编译。当我捕捉到异常时,它起作用了。它是如何工作的??

  • 我已经使用C#(库项目)和Aspect(AOP)编写了Azure函数v1用于日志记录。我在catch块中没有得到异常。 捕获异步方法引发的异常 我有上面讨论的相同问题,但Azure函数运行方法是异步任务,其异常处理和异步void相同。不确定哪里有问题?假设这是函数SDK问题。 Azure函数 记录器方面 解决方法:当我从Azure函数中删除异步等待并通过“getWaiter().GetResult

  • 嘿StackOverflow社区, 关于抛出异常。一般什么时候抛出和异常,什么时候抓取? 假设我遇到了这样的情况,我不得不退出,因为发生了一些问题,我无法从它中恢复过来。我是投还是接? 我现在就这么做: 这样做对吗?如果我只是抛出异常会更合适吗?对不起,我是例外的新手:)

  • 我有一个异步函数,我希望在失败时抛出异常。然而,似乎有一些东西阻止了这一点: 通过省略try catch块,我希望抛出一个异常,我想在函数外部处理这个异常。 我得到的实际结果有点令人困惑: 当我尝试捕获异常并抛出其他东西时,会得到相同的结果: 该函数是从try块调用的,因此看不到这如何是未处理的promise。 我正在尝试使用< code>f作为另一个函数的参数:

  • 问题 你想捕获一个异常后抛出另外一个不同的异常,同时还得在异常回溯中保留两个异常的信息。 解决方案 为了链接异常,使用 raise from 语句来代替简单的 raise 语句。 它会让你同时保留两个异常的信息。例如: >>> def example(): ... try: ... int('N/A') ... except ValueError as e:

  • 我正在尝试测试一些邮件代码的失败模式,在最低级别可能会抛出一个错误。测试和抛出函数之间的所有层都是异步的,并在它们下面的函数上使用await。在顶层(同样在异步函数中,我有一个try catch块。但是,在错误传播到此级别之前,节点正在引发未处理的promise异常。 我的测试代码如下所示 模拟邮件程序有点像这样 以及测试代码的摘要 可以看出,从函数的调用路径将堆栈抛回都是异步函数。但是当我运行这