概念
error,指程序中的非正常运行状态,在其他编程语言中称为“异常”或“错误”。解释器会为每个错误情形创建并抛出一个Error对象,其中包含错误的描述信息。
ECMAScript定义了六种类型的错误。除此之外,还可以使用Error构造方法创建自定义的Error对象,并使用throw语句抛出该对象。
六种错误:
- ReferenceError:引用一个不存在的变量时发生的错误或者将一个值分配给无法分配的对象,比如对函数的运行结果或者this赋值。
- TypeError:当变量或参数不是预期类型时发生的错误,比如对字符串、布尔值、数值等原始类型的值使用new命令就会抛出这种错误。
- RangeError:当一个值超出有效范围时发生的错误,主要有数组长度为负数、number对象的方法参数超出范围、函数堆栈超过最大值。
- SyntaxError:解析代码时发生的语法错误,比如变量名错误、缺少括号等。
-
EvalError:eval函数没有被正确执行时抛出此错误,该错误类型已经不再在ES5中出现了,只是为了保证与以前代码兼容才继续保留。
-
URIError:当URI相关函数的参数不正确时抛出的错误,主要涉及encodeURI、decodeURI、encodeURIComponent、encodeURIComponent、escape、unescape这六个函数。
错误处理
即使程序发生错误,也保证不异常中断的机制。
try{
可能发生错误的代码
}catch(err){
只有发生错误时才执行的代码
}finally{
无论是否出错,肯定都要执行的代码
}
注 :使用try包裹的代码,即使不出错,效率也比不用try包裹的代码低;
在try中,尽量少的包含可能出错的代码;
无法提前预知错误类型的错误,必须用try catch捕获;
finally可以省略;
抛出自定义错误
throw语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。如果调用者函数中没有catch块,程序将会终止。
function sum(...number){
var isNum = number.every( v => !isNaN(v));
if(isNum){
return eval(number.join("+")); //数组求和
}else{
throw new Error("参数必须是数字或数字字符串!");
}
}
console.log(sum(1,2,3)); //6
console.log(sum(1,2,'3')); //6
console.log(sum(1,2,'a3')); //报错! Error: 参数必须是数字或数字字符串!