错误处理与调试[上]
// 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; //浏览器自己抛出了错误