目录
错误类型
一、分类
语句是否执行:
1.语法错误:不会执行
所有语句都不会执行 ,直接报错SyntaxError(如用的中文符号;)
2.通用错误:中断执行
错误语句之前的语句会执行,之后的不会执行
ECMA-262规范:
1.语法错误 SyntaxError
• 变量名不规范 -> var 1 = 1;
• 关键字被赋值 -> function = 5;
• 在function以外使用return语句;
• 其他语法错误 -> var a = 7:
2.引用错误 ReferenceError
• 变量或函数未被声明 -> test();
• 给无法赋值的对象赋值 -> var a = 1 = 2;
3.范围错误 RangeError
RangeError 错误会在数值越界时抛出。
• 数组长度赋值为负数 -> var arr = [1, 2, 3]; arr.length = -1;
• 对象方法参数超出可行范围 -> var num = new Number(66.66); console.log(num.toFixed(-1));
4.类型错误 TypeError
• 调用不可能存在的方法 -> 123();
• 调用对象中不存在的方法 ->obj = {}; obj.run(); //注意,如果写obj.run 不会报错,会返回undefined
• 实例化原始值 -> var a = new ‘string’; //new后面必须接constructor
5.URI错误 URIError
• URIError,只会在使用 encodeURI()或 decodeURI()但传入了格式错误的URI 时发生。
• 区分URI/URL/URN:
1.URI:Uniform Resource Identifier 统一资源标识符
2.URL:Uniform Resource Locator 统一资源定位符
3.URN:Uniform Resource Name 统一资源名称(URL和URN都是URI的子集)
var str = decodeURI(’%hfsljf%’); -> Uncaught URIError
6.eval函数执行错误 EvalError
【eval函数作用:计算 JavaScript 字符串,并把它作为脚本代码来执行】
基本上,只要不把 eval()当成函数调用就会报告该错误:
new eval(); // 抛出 EvalError,但Firefox 和 IE 抛出的是 TypeError
eval = foo; // 抛出 EvalError
二、实例化错误
以上6种错误都对应着构造函数,可以手动实例化对象,构造函数都只接收一个参数 -> 错误消息message。
var error = new SyntaxError('犯了语法错误');
typeof(error);// object
error.name// SyntaxError
error.message// 犯了语法错误
try/catch
try{ }catch(error){ }finally{ }
1、try中放入可能出错的代码,如果 try 块中有代码发生错误,代码会立即退出执行,并跳到 catch 块中。 catch 块此时接收到一个对象error,该对象包含发生错误的相关信息。
2、catch语句中可使用 instanceof 关键字(如 error instanceof TypeError)对不同的错误类型进行处理
3、try 或catch 块都无法阻止 finally 块执行,包括 return 语句。
function test(){
try{
console.log('正常执行1');//正常执行1
console.log(a); //语法错误,执行catch代码块的语句
console.log('正常执行2');//这行及以后的代码都不会执行
return 0;
}catch(e){
console.log(e.name + ':' + e.message);//ReferenceError:a is not defined
return 1;
}finally{
console.log('正常执行3');//正常执行3 finally里的语句一定会执行
}
console.log('正常执行4');//正常执行4 try_catch代码块以外的语句会正常执行
}
test();
throw抛出错误
1、throw 操作符,用于在任何时候抛出自定义错误e, e的数据类型不限。
2、throw也可以抛出系统内置错误的实例化对象 -> 例如 throw new TypeError(“类型错误”);
var val = window.prompt('请输入一个数');
try {
if(typeof(val)=='number'){
throw true;
}else if(val == ""){
throw "is Empty";
}else if(isNaN(val)){
throw "is not a number";
}
}catch(e){
console.log(val + " " + e);
}