错误处理与调试

下述内存主要讲述了《JavaScript高级程序设计(第3版)》第17章关于“错误处理与调试”。

错误处理对于web应用程序开发而言至关重要。不能提前预测可能发生的错误,不能提前采取恢复策略,可能导致较差的用户体验,最终引发用户不满。多数浏览器在默认情况下不会向用户报告错误,因此在开发和调试期间需要启用浏览器的错误报告功能。然而,在投入运行的产品代码中,则不应该再有诸如此类的错误报告出现(例如alert)

一、错误处理

良好的错误处理机制可以让用户及时得到提醒,知道到底发生了什么事,因而不会惊慌失措。

1. try-catch语句

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语句是不太合适的!!!

2. 错误类型

(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格式不正确

3. 抛出错误

抛出错误的目的在于提供错误发生具体原因的消息。
在遇到throw操作符时,代码会立即停止执行。仅当有try-catch语句捕获到抛出的值时,代码才会继续执行。
自定义错误消息

function CustomError(message) {
    this.name = "CunstomError";
    this.message = message;
}
CustomError.prototype = new Error();
throw new CustomError("my error message");

4. 捕获错误

捕获错误的目的在于避免浏览器以默认方式处理它们。

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");

5. 错误事件

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检测。

你可能感兴趣的:(JavaScript,调试,onError,错误处理)