错误类型
执行代码时可能会发生的错误有很多种。每种错误都有对应的错误类型,ECMA-262定义了7种错误类型:
1.Error
2.EvalError
3.RangeError
4.ReferenceError
5.SyntaxError
6.TypeError
7.URIError
其中,Error是基类型(其他六种类型的父类型),其他类型继承自它。Error类型很少见,一般由浏览器抛出的。这个基类型主要用于开发人员抛出自定义错误。
PS:抛出的意思,就是当前错误无法处理,丢给另外一个人,比如丢给一个错误对象。
new Array(-5); //抛出RangeError(范围)
错误信息为:RangeError: invalid array length(无效的数组的长度)
PS:RangeError错误一般在数值超出相应范围时触发
var box = a; //抛出ReferenceError(引用)
错误信息为:ReferenceError: a is not defined(a是没有定义的)
PS:ReferenceError通常访问不存在的变量产生这种错误
a $ b; //抛出SyntaxError(语法)
错误信息为:SyntaxError: missing ; before statement(失踪;语句之前)
PS:SyntaxError通常是语法错误导致的
new 10; //抛出TypeError(类型 )
错误信息为:TypeError: 10 is not a constructor(10不是一个构造函数)
PS:TypeError通常是类型不匹配导致的
PS:EvalError类型表示全局函数eval()的使用方式与定义的不同时抛出,但实际上并不能产生这个错误,所以实际上碰到的可能性不大。
PS:在使用encodeURI()和decodeURI()时,如果URI格式不正确时,会导致URIError错误。但因为URI的兼容性非常强,导致这种错误几乎见不到。
alert(encodeURI('李炎恢'));
利用不同的错误类型,可以更加恰当的给出错误信息或处理。
try {
new 10;
} catch (e) {
if (e instanceof TypeError) { //如果是类型错误,那就执行这里
alert('发生了类型错误,错误信息为:' + e.message);
} else {
alert('发生了未知错误!');
}
}
善用try-catch
在明明知道某个地方会产生错误,可以通过修改代码来解决的地方,是不适合用try-catch的。或者是那种不同浏览器兼容性错误导致错误的也不太适合,因为可以通过判断浏览器或者判断这款浏览器是否存在此属性和方法来解决。
try {
var box = document.getElementbyid('box'); //单词大小写错误,导致类型错误
} catch (e) { //这种情况没必要try-catch
alert(e);
}
try {
alert(innerWidth); //W3C支持,IE报错
} catch (e) {
alert(document.documentElement.clientWidth); //兼容IE
}
PS:常规错误和这种浏览器兼容错误,我们都不建议使用try-catch。因为常规错误可以修改代码即可解决,浏览器兼容错误,可以通过普通if判断即可。并且try-catch比一般语句消耗资源更多,负担更大。所以,在万不得已,无法修改代码,不能通过普通判断的情况下才去使用try-catch,比如后面的Ajax技术。
抛出错误
使用catch来处理错误信息,如果处理不了,我们就把它抛出丢掉。抛出错误,其实就是在浏览器显示一个错误信息,只不过,错误信息可以自定义,更加精确和具体。
try {
new 10;
} catch (e) {
if (e instanceof TypeError) {
throw new TypeError('实例化的类型导致错误!'); //直接中文解释错误信息
} else {
throw new Error('抛出未知错误!');
}
}
PS:IE浏览器只支持Error抛出的错误,其他错误类型不支持。