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'
try
和finally
包裹的代码会依次执行,同时记录其返回结果 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
catch
的return
覆盖try
的异常和return
finally
的异常覆盖try/catch
的异常和return
finally
的return
覆盖try/catch
的异常和return
try/catch/finally
块中异常或return
之后的代码不会被执行