我试图理解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
块说'如果我调用的方法中有任何错误,那么就这样做'。
1条答案
按热度按时间tvmytwxo1#
与注解中一样,DeleteProject被标记为返回
Promise<void>
,但没有标记为async
。像所有非async
函数一样,它可以抛出错误,然后将其作为try
/catch
块的一部分捕获,而不是调用Promise.then
或Promise.catch
。这是两个必须单独处理的独立错误通道。Promise机制会将
throw
抛出的错误转换为被拒绝的Promise,但仅在以下情况下:1.在
new Promise
构造函数中1.在传递给
Promise.then
或Promise.catch
的函数中async
函数除非同步处理错误有真实的价值,否则在这里使用
return Promise.reject(new Error(...))
样式而不是throw new Error(...)
可能更好。要求函数调用者处理两种类型的错误(同步和异步)是不典型的,如果DeleteProject与服务器通信,它可能会异步返回错误。这意味着调用方只有一个错误通道要处理,而不管错误是同步的还是异步的。在OP(sfaust)的后续评论中,他们建议需要处理这两种类型(与服务器异步,与无效输入同步)。区分开发时错误和运行时错误是一个合理的理由,但如果是这样,记录函数(这里是DeleteProject)可以发出两种类型的错误这一事实可能非常重要。但是请记住,即使可以同步检测或捕获错误,仍然取决于您为函数的调用者提供什么样的外部API:对于手动编写的promise返回函数(即没有
async
),通过一个rejected promise发送所有错误可能仍然更可预测,即使这意味着将函数 Package 在try
/catch
块中,并使用Error的特定子类来指示对函数的无效调用。