ECMA-262 第 3 版引入了 try-catch 语旬,当 try-catch 语句中发生错误时, 浏览器会认为错误已经被处理了 ,因而不会报告错误。对于那些不要求用户懂技术,也不需要用户理解错误的 Web 应用程序,这应该说是个理想的结果。不过try-catch 能够让我们实现自己的错误处理机制。使用 try-catch 最适合处理那些无法控制的错误。假设在使用一个大型 JavaScript 库中的函数,该函 数可能会有意无意地抛出一些错误,由于我们不能修改这个库的源代码,所以大可将对该函数的调用放在try-catch语句当中,万一有什么错误发生,也好恰当地处理它们。 在明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不太合适了。例如,如果传递给函数的参数是字符串而非数值,就会造成函数出错,那么就应该先检查参数的类型,然后再决定如何去做。在这种情况下,不应使用try-catch语句。作为 JavaScript 处理异常的一种标准方式。基本语法如下:
try { //可能会导致错误的代码 } catch(error) { //在错误发生时怎么处理}
用户应把所有可能会抛出错误的代码都放在 try 语句块中,而把那些用于错误处理的代码放在 catch 块中。
try { a+b; } catch (error) { alert ("非法的变量");}
如果 try 块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行 catch 块。此时, catch 块会接收到一个包含错误信息的对象。与在其他语言中不同的是,即使不使用这个错误对象,也要给它起个名字。错误对象中包含的实际信息会因浏览器而异,但都有一个保存着错误消息的 message 属性。 ECMA-262 还规定了一个保存错误类型的 name 属性,当前所有浏览器都支持这个属性(Opera 9 之前的版本不支持这个属性〉。因此,在发生错误时,就可以像下面这样实事求是地显示浏览器给出的消息。
//这个例子在向用户显示错误消息时,使用了错误对象的 message和name 属性。try { a+b; } catch (error) { alert(error.message); //错误信息 alert(error.name); //错误类型}
使用 finally
finally 子旬在 try-catch 语句中是可选的,但如果 finally 子句已经使用, 则其代码无论如何都会执行。 无论try或 catch 语句块中包含什么代码一一甚至 return 语句,都不会阻止 finally 子句的执行。只要代码中包含 finally 子旬,那么无论try还是 catch 语句块中的 return 语句都将被忽略。 因此,在使用 finally 子句之前,一定要非常清楚想让代码怎么样。看下面这个函数。
//如果提供 finally 子句,则 catch 子句就成了可选的,IE7 及更早版本中有一个bug: 除非有 catch 子句,否则 finally 中的代码永远不会执行。如果考虑兼容 IE 早期版本,应提供一个 catch 子句,哪怕里面什么都不写, IE8 修复 了这个 bug。function test() { try{ return 2; } catch (error) { return l; } finally { return 0; }}
这个函数在位 try-catch 语句的每一部分都放了一条 return 语句。表面上看,调用这个函数会返回 2, 因为返回 2 的 return 语句位于try语句块中,而执行该语句又不会出错。可是,由于最后还有一个 finally 子句,结果就会导致该 return 语句被忽略, 也就是说,调用这个函数只能返回 0。 如果把自finally子句去掉,这个函数将返回 2。
使用 throw
与问 try-catch 语句相配的还有一个 throw 操作符,用于随时抛出自定义错误。抛出错误时,必须要给 throw 操作符指定一个值,这个值是什么类型没有要求。 在遇到由 throw 操作符时,代码会立即停止执行。 仅当有 try-catch 语句捕获到被抛出的值时,代码才会继续执行。
//下列代码都是有效的。throw 1; throw "hi";throw true;throw {name: "js"};
通过使用某种内置错误类型,可以更真实地模拟浏览器错误。每种错误类型的构造函数接收一个参数,即实际的错误消息。
throw new Error ("抛出错误");throw new SyntaxError("SyntaxError");throw new TypeError("TypeError");throw new RangeError("RangeError");throw new EvalError("EvalError");throw new URLError("URLError");throw new ReferenceError("ReferenceError");
function process(values) { if (!(values instanceof Array)) { throw new Error("process():参数必须为数组。"); } values.sort(); for (var i=0, len=values.length; i100) { return values[i]; } } return -1;}
错误事件
任何没有通过句 try-catch 处理的错误都会触发 window 对象的 error 事件。这个事件是浏览器最早支持的事件之一IE、 Firefox 和 Chrome 为保持向后兼容,并没有对这个事件作任何修改, Opera 和 Safari 不支持 error 事件。 在任何 Web 浏览器中, onerror 事件处理程序都不会创建 event 对象,但它可以接收 3 个参数:
window.onerror = function(message,url,line){ alert(message); //错误信息 alert(url); //错误地址 alert(line); //错误行号 return false; //在事件处理程序中返回 false,可以阻止浏览器报告错误的默认行为。}
通过返回 false,这个函数实际上就充当了整个文档中的 try-catch 语旬,可以捕获所有无代码处理的运行时错误。这个事件处理程序是避免浏览器报告错误的最后一道防线,理想情况下,只要可能就不应该使用它。只要能够适当地使用 try-catch 语句,就不会有错误交给浏览器,也就不会触发 error 事件。