JavaScript中嵌套的try…catch
// 第一种情况
try {
try {
throw new Error('oops'); //=> 抛出一个error对象,对象的message为'oops'
}
finally {
console.log('finally'); //=> 无论是否抛出异常都会执行
}
}
catch (ex) { //=> 捕获到内部try语句抛出的异常对象
console.error('outer', ex.message); //=> "outer oops"
}
// 第二种情况
try {
try {
throw new Error('oops');
}
catch (ex) { //=> 捕获内部异常对象
console.error('inner', ex.message); //=> 'inner oops'
}
finally {
console.log('finally'); //=> 依然执行
}
}
catch (ex) { //=> 这里并不会被触发,因此后面的语句也不会执行
console.error('outer', ex.message); //=> 不会执行
}
// 第三种情况
try {
try {
throw new Error("inner error");
} catch (e) {
console.log(e.message); //=> 输出inner error
throw e;
} finally {
console.log("finally") //=> finally
}
} catch (e) {
console.log(e.message); //=> 依然是输出inner error
}
// 第四种情况,从finally块返回(return)
// 将整个执行代码放入匿名函数中
(function() {
try {
try {
throw new Error('oops'); //=> 抛出一个异常对象
}
catch (ex) {
console.error('inner', ex.message); //=> 正常执行 输出为inner oops
throw ex; //=> 因为finally块中有return语句,因此这里的代码会被挂起,而不会被执行
}
finally {
console.log('finally'); //=> 正常执行
return; //=>返回undefined
}
}
catch (ex) {
console.error('outer', ex.message); //=> 这里的外部catch子句不会被执行,因为内部catch的重新抛出异常语句被忽略了,
// 因此不会再次触发异常,所以这里的catch块不会被触发。
}
})();