错误处理与调试 (14 章 )
1. try – catch 语句
try-catch
finally 语句总会执行,无论是否出错。
finally
使用 try-catch 最适合处理那些我们无法控制的错误,在明明白白的知道自己的代码会发生的错误时,就不要再使用 try-catch语句了。
try {
window.someNonexistentFunction();
} catch (error) {
alert(error.message); // 这个 message 是所有浏览器都支持的
}
抛出错误
与 try-catch 语句相配的还有一个 throw, 例如 throw “hello”, throw true 都是可以的, 没有类型限制
个人自己设定的抛出异常, 最好还是用这种形式 throw new Error("具体异常的message")
在遇到 throw 操作符时,代码会立即停止执行,仅当有 try-catch 语句捕获到被抛出的值时,代码才会继续执行。
function process(values) {
if (!(values instanceof Array)) {
throw new Error("process(): Argument must be an array.");
}
}
自己测试的抛出异常
try {
throw new Error("xxx");
} catch(error) {
alert(error.message);
} finally {
alert("The last one");
}
异常的执行步骤, 跟java一样, 即出现异常后, 程序不会继续执行, 而是到 catch 看捕获情况, finally 最后怎么样都会执行. 以上代码, 执行结果会先显示 "xxx" 再显示 "The last one"
2. 错误的类型
- Error
Error类型的错误很少见,如果有也是浏览器抛出的,这个基类型的主要目的是供开发人员抛出自定义错误。
- EvalError
会在使用 eval()函数而发生异常时被抛出。
- RangeError
超出范围
- ReferenceError
找不到对象
- syntaxError
语法错误
- TypeError
类型错误, 例如 var o = new 10; 最常发生的就是传递参数时,发生的类型不同
- URIError
使用 encodeURI() 或 decodeURI() 而URI格式不正确时,会导致 URIError
常见的错误
1. 类型转换错误, 例子, 如下:
1 function concat(str1, str2, str3) { 2 var result = str1 + str2; 3 if (str3) { // 绝对不要这样 4 result += str3; 5 } 6 return result; 7 } 8 // 如上例, 绝对不要这样, 这个函数的用意是拼接两或三个字符串, 其中, 第3个字符串是可选的, 因此必须要检查, 但是未使用过的命名变量会自动被赋给 undefined值, 而undefined值可以被转换成布尔值 false. 所以, 参考如下: 9 10 function concat(str1, str2, str3) { 11 var result = str1 + str2; 12 if (typeof str3 == "string") { // 比较恰当 13 result += str3; 14 } 15 return result; 16 ]
2. 数据类型错误
1 function reverseSort(values) { 2 if (values != null) { // 绝对不要这样 3 values.sort(); 4 values.reverse(); 5 } 6 } 7 // 任何一个非数组参数, 都将导致错误 8 // 改为以下办法 9 function reverseSort(values) { 10 if (typeof values instanceof Array) { // 问题解决了 11 values.sort(); 12 values.reverse(); 13 } 14 }
调试
以前经常使用 alert 来显示结果和错误, 现在可以使用控制台来完成, 可以通过 console 对象向 javascript 控制台中写入消息, 这个对象具有下列方法.
error(message): 将错误消息记录到控制台
info(message): 将信息性消息记录到控制台
log(message): 将一般消息记录到控制台
warn(message): 将警告消息记录到控制台
例如:
1 function sum(num1, num2) { 2 console.log("Entering sum(), arguments are " + num1 + "," + num2); 3 console.log("Before calculation"); 4 var result = num1 + num2; 5 console.log("After calculation"); 6 7 console.log("Exiting sum()"); 8 return result; 9 }
console.log(变量名)
很多浏览器工具提供了一些调试,比如单步跟踪。