各个浏览器都有打开自己错误调试的方法,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");