【JavaScript】try-catch-finally 执行逻辑,及是否包含 return的影响

try {Block} -catch 语句

try catch 语句首先会执行try包裹的代码块,根据代码块执行结果判断是否进入catch的代码块。

  • 若是catch的代码块也有抛出异常,则会覆盖try语句中的异常抛出
function test (){
    try {
        throw new Error('error1');
    } catch (e) {
        throw new Error('error2');
    }
}
  • 若是catch的代码块有返回结果,则抛出异常时会覆盖try语句的执行结果。不然由于Block是异常抛出,返回undefined。l
function test (){
    try {
        return 0
    } catch (e) {
        return 1
    }
}
test() // 0
function test1 (){
    try {
        throw new Error()
        return 0 // 这里不会执行到
    } catch (e) {
        return 1
    }
}
test1() //1

try {Block} -finally 语句

  • 若是finally的代码块也有抛出异常,则会覆盖try语句中的异常抛出
function test (){
    try {
        throw new Error('error1');
    } finally {
        throw new Error('error2');
    }
}
test() //'error2'
  • tryfinally包裹的代码会依次执行,同时记录其返回结果 B 与 F,若是F 有返回值(正常或者异常返回),则返回F的结果,不然返回B的结果
function test (){
    try {
        throw new Error()
    } finally {
        return 1
    }
}
test() // 1

function test2 (){
    try {
        return 0
    } finally {

    }
}
test2() // 0

function test3 (){
    try {
        return 0
    } finally {
        return 1
    }
}

test3() // 1

try {Block} catch -finally 语句

至关于 try catch 和try finally 的组合执行,先执行try catch 的处理结果 再将其结果与finally合并,finally 中的异常会覆盖 try/catch 中的异常和 return

function test() {
    var a = 1;
    try {
        return a;
    } finally {
        ++a;
    }
}
test() // 1

function test1() {
    var a = 1;
    try {
        return a;
    } finally {
        ++a;
        return a;
    }
}
test1() // 2
function test2() {
    var obj = {a:1};
    try {
        return obj;
    } finally {
        ++obj.a;
    }
}
test2().a // 2

function test3() {
    var obj = {a:1};
    try {
        return obj.a;
    } finally {
        ++obj.a;
    }
}
test1() // 1

总结:

  • catch 异常会覆盖 try 的异常和 return
  • catchreturn 覆盖 try 的异常和 return
  • finally 的异常覆盖 try/catch 的异常和 return
  • finallyreturn 覆盖 try/catch 的异常和 return
  • try/catch/finally 块中异常或 return 之后的代码不会被执行
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值