在刚学一段时间js之后,自己在用js写东西时,就遇到了许多错误信息提示,之前也没怎么关注,但是真正了解之后,发现js的抛出错误是具有一定规则的。
错误对象:JavaScript解析或运行时,一旦发生错误,引擎会抛出一个错误对象,JavaScript原生提供error构造函数,所有抛出的错误都是这个构造函数的实例。
var err = new Error("出错了");
err.message //"出错了"
上面调用Error构造函数,生成一个实例对象err。Error构造函数接受一个参数,表示错误提示,可以从实例的message属性读到这个参数。抛出Error实例对象以后,整个程序就中断在发生错误的地方,不再向下执行。
JavaScript语言标准中提到,Error实例对象必须要有message属性,表示出错时的提示信息,没有提到其他属性。大多数JavaScript引擎,对Error实例还提供name和stack属性,分别表示错误的名称和错误的堆栈,但是他们是非标准的,不是每种实现都有。
- message: 错误提示信息
- name: 错误名称(非标准属性)
- stack: 错误的堆栈(非标准属性)
使用mesage和name属性可以对发生了什么错误有一个大致的了解
Error实例对象是最一般的错误类型,在它的基础上,JavaScript还提供了其他六种错误对象。也就是说,存在Error的六个派生对象。
- SyntaxError对象:SyntaxError对象是解析代码时发生的语法错误,且是在语法解析时就可以发现的错误
主要体现在代码的最基本最简单的部分,比如缺少括号或者多了括号、变量名不规范、需要逗号的地方没有加逗号等
- ReferenceError对象:ReferenceError对象是引用一个不存在的变量时或者将一个值分配给无法分配的对象时(等号左边不是一个变量)(比如对函数的运行结果进行赋值)发生的错误
- RangeError对象:RangeError对象是一个值超出有效范围时发生的错误。
主要有几种情况:
- 数组长度为负数
- Number对象的方法参数超出范围
- 函数堆栈超过最大值
- TypeError对象:TypeError对象是变量或参数不是预期类型时发生的错误
比如,对字符串、布尔值、数值等原始类型的值使用new命令,就会抛出这种错误,因为new命令的参数应该是一个构造函数。
var obj = {};
obj.unkonwMethod();
//Uncaught TypeError : obj.unkonwMethod is not a function
这种情况是调用对象不存在的方法,也会抛出TypeError错误
- URIError对象:URIError对象是URI相关函数的参数不正确时抛出的错误,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()、unescape()这六个函数
- EvalError对象:eval函数没有正确执行时,会抛出EvalError错误。但是该错误已经不再使用了,知识为了保证与以前的代码兼容,才继续保留
总结
以上六种派生错误,连同原始的Error对象,都是构造函数。开发者们可以使用它们手动生成错误对象的实例。这些构造函数都接受一个参数,代表错误提示信息(message)
var err1 = new Error('err1'); var err2 = new RangeError('err2'); var err3 = new TypeError('err3'); var err4 = new SyntaxError('err4'); var err5 = new URIError('err5'); console.log(err1.name + ':' + err1.message); console.log(err2.name + ':' + err2.message); console.log(err3.name + ':' + err3.message); console.log(err4.name + ':' + err4.message); console.log(err5.name + ':' + err5.message);