语法
try {
// do sth
}
catch(e) {
// solve error
}
finally {
// do the last thing
}
规则
- 没有异常的情况下,执行完try后,会执行finally
- 因为return等语句,使程序跳出try后,仍然会执行finally
- 有异常的情况下,如果有catch语句块,会执行catch逻辑,然后执行finally
- 有异常的情况下,如果没有catch语句块,会执行finally,然后想上层代码传递异常
- 可以在finally中抛出异常,这个异常将替换原来存在的异常
- 如果finally中return,其所处的函数将会有正常的返回值,并且异常会被吞掉
var foo = function() { try{ //throw error } finally { return 1 } } foo() //1()不会报错
延长作用域链
catch语句块会产生延长作用域的作用:
var e = {message: 'this is a message'};
var s = 'this is a s';
try {
throw new Error('error!');
} catch (e) {
console.log(e.message); //this is a message
var s = 'this is another s';
var e = {message: 'this is another message'};
console.log(e.message); //this is another message
}
console.log(s); //this is another s
console.log(e); //{message: 'this is a message'}
当js执行到catch代码块时,作用域链也被临时改变了。异常对象e被加入了一个新的作用域对象,并且优先于活动对象成为作用域链第一位。
要注意的是:catch代码块中定义的变量可以被后续的代码所访问,但是异常对象e是无法被访问的,即使使用var语句重新定义了e,这个变量仍然是处在新创建的作用域对象里,而这个作用域对象在catch代码块结束后就会立刻被销毁,因此最后一行所访问的e依然只能访问到第一行所定义的e。