ERROR 和 try...catch

ERROR

ECMA-262中定义了七种错误类型:

  • ERROR
    基类型,其他错误类型都继承自该类型。其主要目的是供开发人员抛出自定义错误

  • EvalError
    在使用 eval() 函数而发生异常时被抛出。如没有把eval()当做函数调用,就会抛出错误。而实践中,浏览器不一定会在该抛出错误时就抛出EvalError。如:

  • RangeError
    当数值超出相应范围时触发此类型错误


  • ReferenceError
    当一个不存在的变量被引用时报这种错误


  • SyntaxError
    语法错误


  • TypeError
    值的类型非预期类型时发生的错误


  • URIError
    使用encodeURI()或者decodeURI(),而URI格式不正确时,就会导致URIError错误

除了以上七种错误类型外,还有一种非标准的错误类型InternalError 。当JavaScript引擎出现内部错误时将会抛出InternalError

  • 自定义错误类型
    创建自定义错误信息时最常用的错误类型是ErrorRangeErrorReferenceErrorTypeError
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的时候,trycatch中的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最适合处理那些不可控的错误。捕获错误的目的在于避免浏览器以默认的方式处理它们;而抛出错误的目的在于提供错误发生具体原因的消息。

你可能感兴趣的:(ERROR 和 try...catch)