错误处理
ES3引入了try-catch和throw语句以及一些错误类型,让开发人员能够适当的处理错误。
2008年以来,大多数web浏览器都已经具备了一些调试JavaScript代码的能力。
try{
// 可能会导致错误的代码
} catch(error){
// 在错误发生时怎么处理
}
如果try块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行catch块。此时,catch块会接收到一个包含错误信息的对象。这个对象中包含的实际信息会因浏览器而异,但共同的是有一个保存着错误消息的message属性。ECMA-262还规定了一个保存错误类型的name属性;当前所有浏览器都支持这两个属性。
4 finally子句
finally子句一经使用,其代码无论如何都会执行。
try语句块中的代码全部正常执行,finally子句会执行;如果因为出错而执行了catch语句块,finally子句照样还会执行。只要代码中包含finally子句,则无论try或catch语句块中包含什么代码——甚至return语句,都不会阻止finally子句的执行。
如果提供了finally子句,则catch子句就成了可选的(catch或finally有一个即可)
5 错误类型
每种错误都有对应的错误类型,而当错误发生时,就会抛出相应类型的错误对象。
定义了7中错误类型:
- Error
Error是基类型,其它错误类型都继承自该类型。Error类型的错误很少见,如果有也是浏览器抛出的;这个基类型的主要目的是供开发人员抛出自定义错误。
- EvalError
会在使用eval()函数发生异常时抛出。简单的说,如果没有把eval()当成函数调用,就会抛出错误。
- RangeError
会在数值超出相应范围时触发。例如:在定义数组时,如果指定了数组不支持的项数,就会触发这种错误。
- ReferenceError
在找不到对象的情况下,会发生ReferenceError(这种情况下,会直接导致“object expected”浏览器错误)。通常,在范围不存在的变量时,就会发生这种错误。
- SyntaxError
当我们把语法错误的JavaScript字符串传入eval()函数时,就会导致此类型错误。
如果语法错误的代码出现在eval()函数之外,则不太可能使用SyntaxError,因为此时的语法错误会导致JavaScript代码立即停止执行。
- TypeError
TypeError类型在JavaScript中会经常用到,在变量中保存着意外的类型时,或者在访问不存在的方法时,都会导致这种错误。错误的原因虽然多种多样,但归根结底还是由于在执行特定于类型的操作时,变量的类型并不符合要求所致。
- URIError
在使用encodeURI()或decodeURI(),而URI格式不正确时,就会导致URIError错误。这种错误也很少见,因为前面说的这两个函数的容错性非常高。
利用不同的类型错误,可以获悉更多有关异常的信息,从而有助于对错误作出恰当的处理。要想知道错误的类型,可以像下面这样在try-catch语句的catch语句中使用instanceof操作符。
6 合理使用try-catch
当try-catch语句中发生错误时,浏览器会认为错误已经被处理了,因而不会通过本章前面讨论的机制记录或报告错误。对于那些不要求用户懂技术,也不需要用户理解错误的Web应用程序,这应该说是个理想的结果。不过,try-catch能够让我妈实现自己的错误处理机制。
使用try-catch最适合处理那些我妈无法控制的错误。假设你在使用一个大型JavaScript库中的函数,该函数可能会有意无意的抛出一些错误。由于我们不能修改这个库的源代码,所以大可将对该函数的调用放在try-catch语句当中,万一有什么错误发生,也好恰当地处理他们。
在明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不太合适了。例如,如果传递给函数的参数是字符串而非数值,就会造成函数出错,那么就应该检查参数的类型,然后再决定如何去做。在这种情况下,不应该使用try-catch语句。