一、finally配合try / catch一起使用;
1、try: 语句测试代码块的错误,一般把可能会出错的代码放到这里;
2、catch: 只有try里面的代码块发生错误时,才会执行这里的代码,参数err记录着try里面代码的错误信息
3、finally: 无论有无异常里面代码都会执行
4、try catch缺点:
1)try catch耗性能
2)try catch捕获不到异步错误
3)try catch可能会导致报错点更模糊5、执行顺序
try里面的代码报错的时候,catch里面的代码才会执行,finally里面的代码永远会执行
catch和finally里面,正常的代码会从上到下顺序执行
如果只是catch里面代码出错,则报catch里面的错误
如果catch和finally都出错则会报finally里面的错误
async fn () {
try{ //只要上面的语句出现错误或者throw语句这句将不会被执行
const res = await userinfo() // 捕获
this.list = res.data.list
console.log('正确')
}catch(err){ //如果try中发现错误,则执行catch中的语句,如果没有错误,则跳过catch
console.log('err')
}finally{
console.log("无论如何都会执行");
}
}
二、finally配合.then和.catch使用
不管一个Promise
的状态是fulfilled
还是rejected
,传递到finally
方法的回调函数onFinally
都会被执行。我们可以把一些公共行为放在onFinally
执行,比如把loading
状态置为false
。或者理解为 不管promise最后的状态,在执行完.then或.catch指定的回调函数以后,都会执行finally方法指定的回调函数。
p.then((res)=>{
console.log('成功=>', res)
}).catch(()=>{
console.log('失败')
}).finally(()=>{
this.loading = false
})
比如在开发我我用到的:用于关闭loading弹框;
uni.showLoading({
title: '加载中...',
mask: true,
})
const data = {
aaa: this.aaa,
bbb: this.bbb
}
promise(data).then(res => {
if(res.success){
this.fff = res.datas.obj;
}else{
this.xxx = {};
this.yyy = true;
this.zzz = res.message;
}
}).catch((err)=>{
console.log("err=>", err);
}).finally(() => {
uni.hideLoading();
})