ERROR
ECMA-262中定义了七种错误类型:
ERROR
基类型,其他错误类型都继承自该类型。其主要目的是供开发人员抛出自定义错误-
EvalError
在使用eval()函数而发生异常时被抛出。如没有把eval()当做函数调用,就会抛出错误。而实践中,浏览器不一定会在该抛出错误时就抛出EvalError。如:
-
RangeError
当数值超出相应范围时触发此类型错误
-
ReferenceError
当一个不存在的变量被引用时报这种错误
-
SyntaxError
语法错误
-
TypeError
值的类型非预期类型时发生的错误
-
URIError
使用encodeURI()或者decodeURI(),而URI格式不正确时,就会导致URIError错误
除了以上七种错误类型外,还有一种非标准的错误类型InternalError 。当JavaScript引擎出现内部错误时将会抛出InternalError。
- 自定义错误类型
创建自定义错误信息时最常用的错误类型是Error、RangeError、ReferenceError和TypeError。
function myError(message){
this.name = "myError";
this.message = message;
}
myError.prototype = new Error();
function foo(str){
//
}
try{
foo();
throw new myError('出现自定义错误');
}catch(e){
console.log(e instanceof myError);
console.log(e.name);
console.log(e.message);
}

try...catch
描述
JavaScript 处理异常的一种标准形式。
try {
//可能会导致错误的代码
} catch (error) {
//在错误发生时怎么处理
}
try语句包含了由一个或多个语句组成的try块,和至少一个catch子句或者一个finally子句的其中一个,或者两个兼有。三种声明方式:
try...catch
try...finally
try...catch...finally
throw
throw语句用来抛出一个用户自定义的异常。抛出错误时,必须要给throw指定一个值,至于这个值是什么类型的则没有要求。当前函数的执行将被停止,throw之后的语句将不会执行。
function fn(){
try{
throw 'error'; //抛出一个字符串异常
return 2; //若return在throw前,return后面的代码也不会执行
}
catch(e){
console.log(e); //'error'
}
}
console.log(fn()); //undefined
finally子句
finally子句在try块和catch块之后执行但是在下一个try声明之前执行。无论是否有异常抛出或捕获它总是执行。另一方面当finally子句有return的时候,try和catch中的return都将被忽略(或者说是覆盖)。
function fn1(){
try {
return 1;
} catch (error) {
return 2;
}finally{
}
}
console.log(fn1()); //1
function fn2(){
try {
return 1;
} catch (error) {
return 2;
}finally{
return ;
}
}
console.log(fn2()); //undefined
关于嵌套
抛出的异常只会被离它最近的封闭 catch 块捕获一次
try {
try {
throw new Error('error')
}catch(e){
console.error('inner',e.message);
throw e;
}finally{
console.log('finally')
}
}catch(e){
console.error('outer',e.message);
}

使用场景
try...catch最适合处理那些不可控的错误。捕获错误的目的在于避免浏览器以默认的方式处理它们;而抛出错误的目的在于提供错误发生具体原因的消息。





