JavaScript原生错误类型

(1)SyntaxError

(2)ReferenceError

(3)RangeError

(4)TypeError

(5)URIError

(6)EvalError

以上这6种派生错误,连同原始的Error对象,都是构造函数。开发者可以使用它们,人为生成错误对象的实例。

异常处理语句

1
2
3
4
5
try {
//...
} catch (err) { //catch参数可以接受从try传来的错误信息
//...
}
1
2
3
4
5
6
7
8
9
10
11
12
var txt = "";

function message() {
try {
allert("Welcome guest!");
} catch (err) {
txt = "本页有一个错误。\n\n";
txt += "错误描述:" + err.message + "\n\n";
txt += "点击确定继续。\n\n";
alert(txt);
}
}
1
2
3
4
5
6
7
8
9
10
11
function myFunction() {
try {
var x = document.getElementById("demo").value;
if (x == "") throw "empty";
if (isNaN(x)) throw "not a number";
if (x > 10) throw "too high";
if (x < 5) throw "too low";
} catch (err) {
console.log("error:", err);
}
}
1
2
3
4
5
6
7
8
9
10
try {
foo.bar();
} catch (e) {
if (e instanceof EvalError) {
console.log(e.name + ": " + e.message);
} else if (e instanceof RangeError) {
console.log(e.name + ": " + e.message);
}
// ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var count = 0;

function countUp() {
try {
return count;
} finally {
count++;
}
}

countUp()
// 0
count
// 1

finally代码块

1
2
3
4
5
6
7
8
9
10
11
12
function cleansUp() {
try {
throw new Error('出错了……');
console.log('此行不会执行');
} finally {
console.log('完成清理工作');
}
}

cleansUp()
// 完成清理工作
// Uncaught Error: 出错了……

上面代码中,由于没有 catch 语句块,所以错误没有捕获执行 finally 代码块以后,程序就中断在错误抛出的方。

finally代码块用法的典型场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function f() {
try {
console.log(0);
throw 'bug';
} catch (e) {
console.log(1);
return true; // 这句原本会延迟到finally代码块结束再执行
console.log(2); // 不会运行
} finally {
console.log(3);
return false; // 这句会覆盖掉前面那句return
console.log(4); // 不会运行
}
console.log(5); // 不会运行
}

var result = f();
// 0
// 1
// 3

result
// false

上面代码中, catch 代码块结束执行之前,会先执行 finally 代码块。从 catch 转入 finally 的标志,不仅有 return 语句,还有 throw 语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function f() {
try {
throw '出错了!';
} catch (e) {
console.log('捕捉到内部错误');
throw e; // 这句原本会等到finally结束再执行
} finally {
return false; // 直接返回
}
}

try {
f();
} catch (e) {
// 此处不会执行
console.log('caught outer "bogus"');
}

上面代码中,进入 catch 代码块之后,一遇到 throw 语句,就会去执行 finally 代码块,其中有 return false 语句,因此就直接返回了,不再会回去执行 catch 代码块剩下的部分了。

参考文章