我在教程中找到了以下代码:
promise.then(function(result){
//some code
}).catch(function(error) {
throw(error);
});
我有点困惑:catch 调用有什么作用吗?在我看来,它没有任何效果,因为它只是抛出了被捕获的相同错误。我基于常规 try/catch 的工作原理。
原文由 Tyler Durden 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在教程中找到了以下代码:
promise.then(function(result){
//some code
}).catch(function(error) {
throw(error);
});
我有点困惑:catch 调用有什么作用吗?在我看来,它没有任何效果,因为它只是抛出了被捕获的相同错误。我基于常规 try/catch 的工作原理。
原文由 Tyler Durden 发布,翻译遵循 CC BY-SA 4.0 许可协议
.then()
和 .catch()
方法都返回 Promises,如果您在任一处理程序中抛出异常,则返回的 promise 将被拒绝,并且异常将在下一个拒绝处理程序中被捕获。
在下面的代码中,我们在第一个 .catch()
中抛出异常,在第二个 .catch()
中被捕获:
new Promise((resolve, reject) => {
console.log('Initial');
resolve();
})
.then(() => {
throw new Error('Something failed');
console.log('Do this'); // Never reached
})
.catch(() => {
console.log('Something failed');
throw new Error('Something failed again');
})
.catch((error) => {
console.log('Final error : ', error.message);
});
第二个 .catch()
返回一个已实现的 Promised,可以调用 .then()
处理程序:
new Promise((resolve, reject) => {
console.log('Initial');
resolve();
})
.then(() => {
throw new Error('Something failed');
console.log('Do this'); // Never reached
})
.catch(() => {
console.log('Something failed');
throw new Error('Something failed again');
})
.catch((error) => {
console.log('Final error : ', error.message);
})
.then(() => {
console.log('Show this message whatever happened before');
});
有用的参考: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Chaining_after_a_catch
希望这可以帮助!
原文由 Philippe Sultan 发布,翻译遵循 CC BY-SA 3.0 许可协议
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
6 回答1.1k 阅读
正如你所展示的那样,赤裸裸的接球和投掷是没有意义的。除了添加代码和减慢执行速度外,它没有做任何有用的事情。所以,如果你要
.catch()
并重新抛出,你应该在.catch()
中做一些事情,否则你应该完全删除.catch()
.该通用结构的通常点是当您想要在
.catch()
中执行某些操作时,例如记录错误或清理某些状态(如关闭文件),但您希望承诺链继续被拒绝。在教程中,它可能只是为了向人们展示他们可以在哪里捕获错误或教授处理错误然后重新抛出错误的概念。
捕获和重新抛出的一些有用原因如下:
但是,在 catch 处理程序中没有其他代码的情况下,简单地捕获并重新抛出相同的错误对代码的正常运行没有任何用处。