ECMA-262 第3 版新增了try/catch 语句,作为在JavaScript 中处理异常的一种方式。基本的语法
如下所示,跟Java 中的try/catch 语句一样:
try {
// 可能出错的代码
} catch (error) {
// 出错时要做什么
}
任何可能出错的代码都应该放到try 块中,而处理错误的代码则放在catch 块中,如下所示:
try {
window.someNonexistentFunction();
} catch (error){
console.log(“An error happened!”);
}
如果try 块中有代码发生错误,代码会立即退出执行,并跳到catch 块中。catch 块此时接收到
一个对象,该对象包含发生错误的相关信息。与其他语言不同,即使在catch 块中不使用错误对象,
也必须为它定义名称。错误对象中暴露的实际信息因浏览器而异,但至少包含保存错误消息的message
属性。ECMA-262 也指定了定义错误类型的name 属性,目前所有浏览器中都有这个属性。因此,可以像下面的代码这样在必要时显示错误消息:
try {
window.someNonexistentFunction();
} catch (error){
console.log(error.message);
}
这个例子使用message 属性向用户显示错误消息。message 属性是唯一一个在IE、Firefox、Safari、
Chrome 和Opera 中都有的属性,尽管每个浏览器添加了其他属性。IE 添加了description 属性(其值
始终等于message)和number 属性(它包含内部错误号)。Firefox 添加了fileName、lineNumber
和stack(包含栈跟踪信息)属性。Safari 添加了line(行号)、sourceId(内部错误号)和sourceURL
属性。同样,为保证跨浏览器兼容,最好只依赖message 属性。
finally 子句
try/catch 语句中可选的finally 子句始终运行。如果try 块中的代码运行完,则接着执行
finally 块中的代码。如果出错并执行catch 块中的代码,则finally 块中的代码仍执行。try 或
catch 块无法阻止finally 块执行,包括return 语句。比如:
function testFinally(){
try {
return 2;
} catch (error){
return 1;
} finally {
return 0;
}
}
这个函数在try/catch 语句的各个部分都只放了一个return 语句。看起来该函数应该返回2,
因为它在try 块中,不会导致错误。但是,finally 块的存在导致try 块中的return 语句被忽略。
因此,无论什么情况下调用该函数都会返回0。如果去掉finally 子句,该函数会返回2。如果写出
finally 子句,catch 块就成了可选的(它们两者中只有一个是必需的)。
07-21
1130
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
03-15
3102
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)