错误处理与调试[上]

// try-catch 特点
    // 1.可以获取错误信息
    // 2.避免浏览器控制台报错
    // 3.可以屏蔽错误,继续执行,PS:但是继续执行的语句如果和错误的语句有上下文关联,那么下面可能继续出错

    // try{  //尝试着执行try包含的代码
    //     window.abcdef();  //不存在的方法
    // }catch(e){  //如果有错误,执行catch,e是异常对象
    //     alert(e);  //直接打印调用toString()方法,非IE浏览器执行了toString();
    //     //alert(e.name); //IE不支持name
    //     alert(e.message);  //message属性是跨浏览器最好的
    // }

    // alert();

    // ----------------------------------------------------------------------

    // function box(){
    //     try{
    //         var b={};
    //         window.abcdef(); //这个会中断操作
    //     }catch(e){
    //         alert(e);
    //         return;  //因为执行了catch说明有错误,那么再继续往下执行也还是会错,所以就返回了
    //     }finally{
    //         alert('不管是否产生错误,我都会执行!');
    //         b=null;   //如果用了try-catch,就把清理工作交给finally即可
    //     }
    // }
    // box();

    // PS: 7种错误类型:1.Error 2.EvalError  3.RangeError  4.ReferenceError  5.SyntaxError  6.TypeError  7.URIError,
    // 其中Error 是基类型(其他六种类型的父类型),其他类型继承自它。Error类型很少见,一般由浏览器抛出的。这个基类型主要用于开发人员抛出自定义错误。

    // -------------------------------------------------------------------------
    //new Array(-5); //Uncaught RangeError: Invalid array length  范围错误

    //var box=x;  //Uncaught ReferenceError: x is not defined  未捕获  引用错误

    //a $ b;  //Uncaught SyntaxError: Unexpected identifier  语法错误

    //new 10;  //Uncaught TypeError: 10 is not a function 类型错误 10不是构造函数

    // try{
    //     new 10;
    // }catch(e){
    //     if(e instanceof TypeError){  //通过这种方法可以更加精确的得到错误类型,而可以更加准确的去处理
    //         alert('类型错误:'+e.message);
    //     }else{
    //         alert('未知错误:'+e);
    //     }
    // }
    // try-catch的意义
    // 1.可以通过修改代码来排错的,不需要使用try-catch
    // 2.浏览器兼容性问题,可以通过判断浏览器或者判断是否支持某个属性或方法来判断,不需要try-catch
    // 比如,无法修改代码的情况下,可能会发生错误,这个时候用try-catch,例如网络中断了

    // try{
    //     alert(innerWidth); //W3C
    // }catch(e){
    //     alert(document.documentElement.clientWidth); //IE
    // }
    // PS: 这样的确能实现兼容性问题,但逻辑上是不正确的
    // PS:因为innerWidth不支持的浏览器,可能不一定是IE

    // -----------------------------------------------------------------

    // try{
    //     new 10;
    // }catch(e){
    //     alert(e); //这种行为叫做处理错误,浏览器不报错了,因为处理掉了,屏蔽了错误显示
    // }
    //抛出错误,说明我们自己无法解决,就需要把错误爆出,报出
    try{
        new 10;
    }catch(e){
        if(e instanceof TypeError){
            throw new TypeError('类型错误:实例化new的时候,可能产生了错误!');
        }else{
            throw new Error('未知错误!');
        }
    }

    new 10; //浏览器自己抛出了错误
posted @ 2017-09-18 15:13  耿鑫  阅读(104)  评论(0编辑  收藏  举报