一、概念
error是指程序中的非正常运行状态,在其他编程语言中称为“异常”或“错误”,解释器会为每个错误情形创建并抛出一个Error对象,其中包含错误的描述信息;
ECMAScript定义了六种类型的错误,除此之外,还可以使用Error构造方法创建自定义的Error对象,并使用throw语句抛出该对象;
六种错误:
1)ReferenceError:引用错误,要用的东西没找到;
2)TypeError:类型错误,错误的调用了对象的方法;
3)RangeError:范围错误,专指参数超范围;
4)SyntaxError:语法写错了;
5)EvalError:eval()方法错误的使用;
6)URIError:URI地址错误;
二、错误处理
即使程序发生错误,也保证不异常中断的机制;
try{
// 可能发生错误的代码
}catch(err){
// 只有发生错误时才执行的代码
}finally{
// 无论是否出错,肯定都要执行的代码
}
使用要点:
1)使用try包裹的代码,即使不出错,效率也比不用try包裹的代码低;
2)在try中,尽量少的包含可能出错的代码;
3)无法提前预知错误类型的错误,必须用try...catch...捕获,如果已经提前预知错误的类型,就用if...else...来代替try...catch,除掉错误预知的这个前提,if...else...的用法和try...catch...的用法是基本相同的,且if...else...的可读性比try...catch...更强,语句理解能力也更好,开发人员与用户更加倾向于使用if...else...,但是如果无法判断语句是否正确的话,使用try...catch...会更加保险;
4)finally可以省略;
三、抛出自定义错误
// if...else...
function err(a) {
if (!isNaN(a)) {
console.log('你输入的数字是:' + a);
} else {
throw new Error('你输入的是非数字,请重新输入!')
}
}
var a = prompt('请输入一位数字:');
err(a);
// 定义round函数
function round(num, d) {
if (!isNaN(num) && !isNaN(d)) {
num *= Math.pow(10, d);
return num;
} else {
// 抛出自定义错误
throw new Error("参数必须是数字");
}
}
// 调用round函数
var d = parseInt(prompt('请输入数字'));
try {
alert(round(123.456, d));
} catch (err) {
alert(err.message); // 接住抛出的自定义错误
}
四、代码分析
var n = 1;
function fun() {
try {
n++;
return n;
n++; // 不执行
var m =1;
} catch (err) {
n++;
return n;
} finally {
n++;
return n;
}
}
console.log(fun()); // 3 return为finally的
console.log(n); // 3
console.log(m); // m is not defined
var n = 1;
function fun() {
try {
n++;
return n;
n++; // 不执行
var m =1;
} catch (err) {
n++;
return n;
} finally {
n++;
}
}
console.log(fun()); // 2 return为try的
console.log(n); // 3
console.log(m); // m is not defined
var n = 1;
function fun() {
try {
n++;
n+=m; // 出错
return n;
} catch (err) {
n++;
return n;
} finally {
n++;
}
}
console.log(fun()); // 3 return为catch的
console.log(n); // 4
参考:
js 错误Error对象详解
网友评论