typescript 承诺抓不到

nbnkbykc  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(130)

我试图理解Promise中的错误捕获,但我没有得到任何东西。我已经读了它,从我所看到的一切,它应该是工作,所以我不知道我错过了什么。我有一个示例方法,现在我只是抛出一个错误(以模拟它以后实际上何时抛出错误)。这个方法看起来像这样:

DeleteProject(id: string, customerId: string): Promise<void> {
    throw new Error('test error');
}

我在代码中这样调用它:

projectService.DeleteProject(state.FocusedProject.ID, state.FocusedProject.CustomerID)
    .then(() => {
        ...stuff when it works...
    })
    .catch(error => {
        console.log('caught you');
        HandleError(error, 'Delete Project');
    });

当这个方法没有抛出错误时,then块中的代码被调用,一切正常。但是,当我抛出错误时,它会给我一个未处理的执行错误,并且catch块永远不会被调用。
从我所读到的一切来看,在该函数内部抛出错误应该会被自动捕获并返回被拒绝的promise,对吗?如果是这样的话,什么时候不被抓呢?
我肯定我漏掉了什么但我看不出是什么。我基本上希望catch块说'如果我调用的方法中有任何错误,那么就这样做'。

tvmytwxo

tvmytwxo1#

与注解中一样,DeleteProject被标记为返回Promise<void>,但没有标记为async。像所有非async函数一样,它可以抛出错误,然后将其作为try/catch块的一部分捕获,而不是调用Promise.thenPromise.catch。这是两个必须单独处理的独立错误通道。
Promise机制会将throw抛出的错误转换为被拒绝的Promise,但仅在以下情况下:
1.在new Promise构造函数中
1.在传递给Promise.thenPromise.catch的函数中

  1. async函数
    除非同步处理错误有真实的价值,否则在这里使用return Promise.reject(new Error(...))样式而不是throw new Error(...)可能更好。要求函数调用者处理两种类型的错误(同步和异步)是不典型的,如果DeleteProject与服务器通信,它可能会异步返回错误。这意味着调用方只有一个错误通道要处理,而不管错误是同步的还是异步的。
    在OP(sfaust)的后续评论中,他们建议需要处理这两种类型(与服务器异步,与无效输入同步)。区分开发时错误和运行时错误是一个合理的理由,但如果是这样,记录函数(这里是DeleteProject)可以发出两种类型的错误这一事实可能非常重要。但是请记住,即使可以同步检测或捕获错误,仍然取决于您为函数的调用者提供什么样的外部API:对于手动编写的promise返回函数(即没有async),通过一个rejected promise发送所有错误可能仍然更可预测,即使这意味着将函数 Package 在try/catch块中,并使用Error的特定子类来指示对函数的无效调用。

相关问题