1. try-catch 语句
1.1 将可能会抛出错误的代码都放在try语句块中,而把那些用于错误处理的代码放在catch块中。
try {
//可能会导致错误的代码
someFunction();
} catch (error) {
//在错误发生时怎么处理
alert(error.message)
}
1.2 finally字句
虽然finally字句是可选的,但是一经使用,其代码无论如何都会执行。
function testFinally () {
try {
return 2;
} catch (error) {
return 1;
} finally {
return 0;
}
}
注:只要代码中包含finally字句,那么无论try还是catch语句块中的return语句都将被忽略。
2. error事件
任何没有通过try-catch处理的错误都会触发window对象error事件。
window.onerror = function (message, url, line) {
alert(message);
}
注:
1. 常见的错误类型
1.1 类型转换错误
1.2 数据类型错误
1.3 通信错误
类型转换错误:
在使用相等(==)和不相等(!=)操作符,或者在if、for、while等流程控制语句中使用非布尔值时,最常发生类型转换错误。建议使用全等(===)和不全等(!==)操作符,以避免类型转换。
在流程控制语句中使用非布尔值,是极为常见的错误来源。为避免此类错误,就要在条件比较时切实传入布尔值。
function concatenate (str1, str2, str3) {
let result = str1 + str2;
if (typeof str3 === "string") {
result += str3;
}
return result;
}
数据类型错误:
function reverseSort (values) {
//验证传入的数据是否合法
if (values instanceof Array) {
values.sort();
values.reverse();
}
}
大体上来说,基本类型的值应该使用typeof来检测,而对象的值则应该使用instanceof来检测。
通信错误:
javascript与服务器之间的任何一次通信,都有可能产生错误。
对于查询字符串,应该记住必须要使用encodeURIComponent()方法。
把错误记录到服务器
function logError (sev, msg) {
//sev表示错误的严重程度 nonfatal:非致命的错误
let img = new Image();
img.src = "log.php?sev=" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent(msg);
}
只要是使用try-catch语句,就应该把相应错误记录到日志中。
for (let i = 0, len = modules.lenght; i < len; i++) {
try {
modules[i].init();
} catch (error) {
logError("nonfatal", "Module init failed:" + error.message);
}
}
对于大型应用来说,自定义的错误通常都使用assert()函数来抛出。
function assert (condition, message) {
if (!condition) {
throw new Error(message);
}
}