下述内存主要讲述了《JavaScript高级程序设计(第3版)》第17章关于“错误处理与调试”。
错误处理对于web应用程序开发而言至关重要。不能提前预测可能发生的错误,不能提前采取恢复策略,可能导致较差的用户体验,最终引发用户不满。多数浏览器在默认情况下不会向用户报告错误,因此在开发和调试期间需要启用浏览器的错误报告功能。然而,在投入运行的产品代码中,则不应该再有诸如此类的错误报告出现(例如alert)
良好的错误处理机制可以让用户及时得到提醒,知道到底发生了什么事,因而不会惊慌失措。
window.ligang(); // Uncaught TypeError: window.ligang is not a function(…)
console.log("go on"); // 不再执行!!!
try {
window.ligang();
}catch(error) {
console.log(error.message); // window.ligang is not a function
}
console.log("go on"); // 继续执行
function testFinally() {
try{
return 0;
} catch(error) {
return 1;
} finally {
return 2;
}
}
testFinally(); // 2
注意: (1)只要代码中包含finally子句,那么无论try还是catch语句块中的return语句都将被忽略。因此使用finally子句之前,一定要非常清楚你想让代码怎么样。【IE7及更早版本,除非有catch子句,否则finally中的代码永远不会执行】 (2)在明明白白知道自己的代码会发生错误时,使用try-catch语句是不太合适的!!!
(1)Error:供开发人员抛出自定义错误 (2)EvalError:使用eval()函数而发生异常时被抛出【new eval() 实践中,浏览器不一定会抛出该错误】 (3)RangError:数值超出范围时触发【new Array(-10)】 (4)ReferenceError:访问不存在变量时【a;】 (5)SyntaxError:把语法错误的JavaScript字符串传入eval()函数时【eval(“a ++ b”)】 (6)TypeError:执行特定于类型的操作时,变量的类型不符合要求【var a; a();】 (7)URIError:使用encodeURI()、decodeURI()时,URL格式不正确
抛出错误的目的在于提供错误发生具体原因的消息。 在遇到throw操作符时,代码会立即停止执行。仅当有try-catch语句捕获到抛出的值时,代码才会继续执行。 自定义错误消息
function CustomError(message) {
this.name = "CunstomError";
this.message = message;
}
CustomError.prototype = new Error();
throw new CustomError("my error message");
捕获错误的目的在于避免浏览器以默认方式处理它们。
function process(values){
if (!isArray(values)){
throw new Error("process(): Argument must be an array.");
}
values.sort();
for (var i=0, len=values.length; i < len; i++){
if (values[i] > 100){
return values[i];
}
}
return -1;
}
(1)typeof [] ==> “object” (2)values instanceof Array ==> 多框架环境下使用会有问题
function isType(type) {
return function(obj) {
return {}.toString.call(obj) == "[object " + type + "]"
}
}
var isObject = isType("Object");
var isArray = Array.isArray || isType("Array");
winow.onerror = function(message, url, line) {
console.log(message);
return false; // 阻止浏览器报告错误的默认行为
}
(1)类型转换错误 (2)数据类型错误 (3)通信错误
示例:类型转换错误
console.log(5 == "5");
function concat(str1, str2, str3) {
var result = str1 + str2;
if(str3) { // str3 ==> 0
result += str3;
}
return result;
}
示例:数据类型错误
function test(callback) {
// ...
if(typeof callback === "function") {
callback();
}
}
基本类型的值应该使用typeof检测;对象的值应该使用instanceof检测。