似乎我们更喜欢使用catch来处理异常,因为拒绝函数可能会遗漏一些错误,例如:在下面的代码中,未定义的错误a将不会被缓存。
public class SomeClass
{
private readonly NotifyService _service;
public SomeClass(NotifyService service)
{
_service = service;
}
public Task Send(string message)
{
return _service.SendNotificationAsync(message);
}
}
我们更喜欢使用catch方法来捕获如下错误:
const promise = new Promise((resolve,reject) => {
console.log(1)
resolve('successfully')
})
promise
.then((data) => {
console.log(data)
console.log(a)
}, (err) => {
console.log(err)
})
我的问题是:是否有任何解决方案需要同时使用拒绝和捕获方法?
答案 0 :(得分:0)
他们只是链。
promise.then(foo, bar)
此处bar
将 不 处理foo
中可能出现的任何错误。
promise.then(foo).catch(bar)
此处bar
将 处理promise
或foo
中发生的任何错误。
所以,是的,有时你想要一个,有时你想要另一个,有时你可能想要两个。
function foo() {
throw 'foo';
}
function bar(err) {
console.log('Caught', err);
}
Promise.resolve().then(foo, bar); // Uncaught error
Promise.reject('promise').then(foo, bar);
Promise.resolve().then(foo).catch(bar);
Promise.reject('promise').then(foo).catch(bar);
Promise.resolve().then(foo, bar).catch(bar);

一个实际的例子:
someOperation()
.then(
result => someOtherFunction(result.value),
err => {
console.warn('Operation failed!', err);
return 'alternative value';
}
)
.then(result => alert('The result is: ' + result))
.catch(err => console.error('Everything is wrong :(', err);
如果someOperation
成功,我们会继续处理其值,否则我们将替换某些默认值;如果整个链中的任何地方都失败了,我们就会有一个全局的最终错误处理程序。