Promise错误处理
一、Promise中then中两个回调和用catch捕获错误的区别 https://blog.csdn.net/qq_41968486/article/details/123544784
1. 区别
主要区别就是,如果在then的第一个函数里抛出了异常,后面的catch能捕获到,而then的第二个函数捕获不到。
- then的第二个参数和catch捕获错误信息的时候会遵循就近原则。
如果是promise内部报错,reject抛出错误后,then的第二个参数和catch方法都存在的情况下,只有then的第二个参数能捕获到,如果then的第二个参数不存在,则catch方法会捕获到。来看下面的例子:const promise = new Promise((resolve, rejected) => { throw new Error('test'); }); //此时只有then的第二个参数可以捕获到错误信息 promise.then(res => { // }, err => { console.log(err); }).catch(err1 => { console.log(err1); }); //此时catch方法可以捕获到错误信息 promise.then(res => { // }).catch(err1 => { console.log(err1); }); //此时只有then的第二个参数可以捕获到Promise内部抛出的错误信息 promise.then(res => { throw new Error('hello'); }, err => { console.log(err); }).catch(err1 => { console.log(err1); }); //此时只有then的第二个参数可以捕获到Promise内部抛出的错误信息 promise.then(res => { throw new Error('hello'); }, err => { console.log(err); }); //此时catch可以捕获到Promise内部抛出的错误信息 promise.then(res => { throw new Error('hello'); }).catch(err1 => { console.log(err1); });
- promise内部没有报错,第一个then里面抛出错误,后面的catch能捕获到,而then的第二个函数捕获不到。
- then里面通过 trow 抛出错误
const promise = new Promise((resolve, rejected) => { resolve('12') }); // 此时只有catch可以捕获到错误信息,第二个then回调无法捕获 promise.then(res => { throw new Error('23') }, err => { console.log('1',err); }).catch(err1 => { console.log('2',err1); });
- then里面通过 return Promise.reject() 返回错误promise。这就是返回一个fail状态的promise对象。
const promise = new Promise((resolve, rejected) => { resolve('12') }); // 此时只有catch可以捕获到错误信息,第二个then回调无法捕获 promise.then(res => { return Promise.reject('12') }, err => { console.log('1',err); }).catch(err1 => { console.log('2',err1); });
- then里面通过 trow 抛出错误
总结:promis的then方法第一个回调不管怎样,都是无法进入第二个then回调的。所以推荐用catch捕获。
2. 两个捕获方法的比较
// bad promise .then(function(data) { // success }, function(err) { // error }); // good promise .then(function(data) { //cb // success }) .catch(function(err) { // error });
上面代码中,第二种写法要好于第一种写法,理由是第二种写法可以捕获前面then方法执行中的错误,也更接近同步的写法(try/catch)。因此,建议总是使用catch方法,而不使用then方法的第二个参数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!