大家都知道在java中有一套异常处理机制,即用try-catch-finally来捕获异常,用throw来抛出异常。JavaScript也有一套类似java的错误处理机制。
1. try-catch-finally
ECMA-262 第3 版引入了try-catch 语句,作为JavaScript 中处理异常的一种标准方式。基本的语法如下所示,显而易见,这与Java 中的try-catch 语句是完全相同的。
try { //可能会导致错误的代码 } catch(error) { //在错误发送时处理错误的代码 } finally { //不论代码是否发送错误都要执行的代码 }
如果try 块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行catch 块。此时,catch 块会接收到一个包含错误信息的对象。不同浏览器error对象中的信息页不同,但也有一个公共的属性: message.
在JavaScript中finally和java中的finally有一些不同: JavaScript中即使try块或catch块中有return语句,finally中的语句仍会执行,finally会忽略掉try块或finally块中的return语句。
一般情况下,如果提供finally 子句,则catch 子句就成了可选的(catch 或finally 有一个即可)。
下面再来介绍一下JavaScript中的错误类型。JavaScript中共有7中错误类型: Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError
Error: 所有错误类型的基类。这个基类型的主要目的是供开发人员抛出自定义错误。
EvalError: 在使用eval()函数而发生异常时被抛出。如果没有把eval()当成函数调用,就会抛出错误,例如:
RangeError: 在数值超出相应范围时触发,如数组越界。
ReferenceError: 通常,在访问不存在的变量时,就会发生这种错误.
SyntaxError: 语法错误时抛出的异常。通常是在吧错误语法传入eval函数时触发的。
TypeError: 在变量中保存着意外的类型时,或者在访问不存在的方法时,都会导致这种错误。如"aaa".getTime()
URIError: 在使用encodeURI()或decodeURI(),而URI 格式不正确时,就会导致URIError 错误。
利用不同的错误类型,可以获悉更多有关异常的信息,从而有助于对错误作出恰当的处理。
try { someFunction(); } catch (error){ if (error instanceof TypeError){ //处理类型错误 } else if (error instanceof ReferenceError){ //处理引用错误 } else { //处理其他类型的错误 } }
2. throw抛出错误
与try-catch 语句相配的还有一个throw 操作符,用于随时抛出自定义错误。抛出错误时,必须要给throw 操作符指定一个值,这个值是什么类型,没有要求。下列代码都是有效的。
throw 12345; throw "Hello world!"; throw true; throw { name: "JavaScript"};
在遇到throw 操作符时,代码会立即停止执行。仅当有try-catch 语句捕获到被抛出的值时,代码才会继续执行。通过使用某种内置错误类型,可以更真实地模拟浏览器错误。每种错误类型的构造函数接收一个参数,即实际的错误消息。下面是一个例子。
function division(x, y) { if(y == 0) { throw new Error('0不能作为除数'); } return x/y; } (function testTry() { try { division(2, 0) } catch(error) { console.log(error.message); //0不能作为除数 console.log(error.stack); } finally { console.log('execute finally'); } })()
另外,利用原型链还可以通过继承Error 来创建自定义错误类型。此时,需要为新创建的错误类型指定name 和message 属性。来看一个例子。
function CustomError(message) { this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error();
3. 抛出错误与使用try-catch
关于何时该抛出错误,而何时该使用try-catch 来捕获它们,是一个老生常谈的问题。一般来说,应用程序架构的较低层次中经常会抛出错误,但这个层次并不会影响当前执行的代码,因而错误通常得不到真正的处理。如果你打算编写一个要在很多应用程序中使用的JavaScript 库,甚至只编写一个可能会在应用程序内部多个地方使用的辅助函数,我都强烈建议你在抛出错误时提供详尽的信息。然后,即可在应用程序中捕获并适当地处理这些错误。
说到抛出错误与捕获错误,我们认为只应该捕获那些你确切地知道该如何处理的错误。捕获错误的目的在于避免浏览器以默认方式处理它们;而抛出错误的目的在于提供错误发生具体原因的消息。
4. onerror事件
任何没有通过try-catch 处理的错误都会触发window 对象的error 事件。在任何Web 浏览器中,onerror 事件处理程序都不会创建event 对象,但它可以接收三个参数:错误消息、错误所在的URL 和行号。
window.onerror = function(message, url, line){ alert(message); return false; }; var a = b;
只要发生错误,无论是不是浏览器生成的,都会触发error 事件,并执行这个事件处理程序。然后,浏览器默认的机制发挥作用,像往常一样显示出错误消息。
浙公网安备 33010602011771号