错误调试

各个浏览器都有打开自己错误调试的方法,ie需在工具栏中打开,但没有控制台,会弹出弹窗,其它浏览器还好,都能显示控制台;

try{}catch(error){}finally{}:这个try-catch语句经常用到,将可能发生错误的语句块儿放在try里,将发生错误后执行的代码放在catch里,finally语句块儿 是可选的,如果存在,无论执行try还是catch最后都会执行finally,需要注意的是,当try或catch里有return时,而finally也存在return,则finally里的return会覆盖前面两个的return。

错误类型

Erroe:Error是基本类型,所有报错类型都继承该类型

EvalError:eval()函数执行发生错误时发生

RangeError:数值超出范围

ReferenceError:找不到对象

SyntaxError:将错误语法的字符串传入eval()方法时发生

TypeError:执行指定类型的操作时,变量类型不对时抛出

URIError:url解码编码错误时抛出

throw  可以抛出自定义错误信息,在throw后面跟上自定义的错误信息即可,无类型规定。

            throw 12345;
            throw "hellow";
            throw true;
            throw {name:"error"};
            throw "aaa未定义";
            throw new Error("错误信息");
            throw new SyntaxError("错误信息");
            throw new RangeError("错误信息");
            throw new EvalError("错误信息");
            throw new URIError("错误信息");
            throw new ReferenceError("错误信息");

利用原型链还可以继承Error来创建自定义错误类型。此时需要为新创建的错误类型指定name和message属性。

    function CustomError(message){
            this.name="CustomError";
            this.message=message;
      }
      CustomError.prototype=new Error();
      throw new CustomError("my message");

也可以用onerror事件来代替浏览器自身的报错,不过得阻止浏览器的默认报错:

    window.addEventListener("error",function(message){
            console.log(message);
            return false;//竟然并无卵用,浏览器自身还是要报错;
      },false);
      console.log(aaa);

图像也支持error事件。只要图像中url特性中的URL不能返回可以被识别的图像格式,就会触发error事件。此时error事件遵循DOM格式,会返回一个以图像为目标的event对象:

    var image=new Image();
      image.addEventListener("load",function(event){
            console.log("image loaded!");
      },false);
      image.addEventListener("error",function(event){
            console.log("image not loaded!");
      },false);
      image.src="haaa.gif";//指定的文件不存在

 避免各类错误的小总结

1、我们在使用流程控制语句时,会存在若转化,比如if(1==“1”)会将1先转化为字符串,再比较,这个时候很容易发生类型错误,所以比较时尽量用全等和不全等。

2、如果知道传入参数的类型时,我们要做一下类型判断,基本类型用typeof判断,而对象值(引用类型)用instanceof来判断属于哪个类型。

3、什么是查询字符串(URL参数)?

查询字符串(URL参数)是指在URL的末尾加上用于向服务器发送信息的字符串(变量)。将“?”放在URL的末尾,然后再加上“参数=值”,想加上多个参数的话,使用“&”。以这个形式,可以将想要发送给服务器的数据添加到URL中。

当用到查询字符串向服务器发送信息时,一定要使用encodeURIComponent()方法对数据进行编码。

如果查询字符串格式有错误,调用encodeURIComponent()方法编码后就可以避免这种格式错误,我们通常可以编写一个处理查询字符串的函数:

    function addQueryStringArg(url,name,value){
            if(url.indexOf("?") == -1){
                  url += "?";
            }else{
                  url += "&";
            }
            url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
            return url;
      }

调试技术:

目前不需要用alert()来进行调试了,因为,大多流行浏览器都带有控制台,可以将错误打印到控制台上。

对于firefox而言,需要安装Firebug(www.getfirebug.com),因为firefox要使用Firebug的控制台。对IE8、firefox、chrome和safari来说,可以通过console对象向javascript控制台写入消息。这个对象有以下几个方法:

error(message):将错误消息记录到控制台;

info(message):将信息性消息记录到控制台;

log(message):将一般消息记录到控制台;

warn(message):将警告消息记录到控制台;

下面写一个像javascript控制台写入消息的统一接口:

    function log(message){
            if(typeof console == "object"){
                  console.log(message);
            }else if(typeof opera == "object"){
                  opera.postError(message);
            }else if(typeof java == "object" && typeof java.lang == "object"){
                  java.lang.System.out.printIn(message);
            }
      }

向javascript控制台写入消息可以辅助调试代码,但在发布应用程序时,还必须要移除所有消息。

将消息记录到当前页面:

就是在页面开辟一小块区域,用以显示消息:

    function log(message){
            var console=document.getElementById("debuginfo");
            if(console === null){
                  console=document.createElement("div");
                  console.id="debuginfo";
                  console.style.background="#dedede";
                  console.style.border="1px solid silver";
                  console.style.padding="5px";
                  console.style.width="400px";
                  console.style.position="absolute";
                  console.style.right="0px";
                  console.style.top="0px";
                  document.body.appendChild(console);
            }
            console.innerHTML+="<p>"+message+"</p>";
      }
      log("haaa")

上述这种技术再IE7之前版本非常有用。

抛出错误:

抛出错误也是一种调试代码的号方法,可以将throw 抛出错误封装一个方法,减少抛出错误的代码量;我们封装一个assert()方法:

    function assert(condition,message){
            if(!condition){
                  throw new Error(message);
            }
      }

例如:

    function divide(num1,num2){
            assert(typeof num1 =="number" && typeof num2 == "number","divide():Both argument must be numbers");
            return num1/num2;
      }
      divide(1,"2");
原文地址:https://www.cnblogs.com/fqh123/p/10587489.html