JavaScript反静音技术表明失败

时间:2010-07-17 01:16:12

标签: javascript error-handling assert defensive-programming

在JavaScript中报告错误而不是依赖于null的好方法,以及在发生错误且函数无法继续进行时未定义的错误方法。我可以想到三种方法:

  1. 什么都不做
  2. 抛出异常
  3. 断言
  4. 这是一个简单的示例场景 - 一个函数,用于为用户帐户记入传入的金额。函数creditAccount对象的一部分。

    这是天真的解决方案。

    function credit(amount) {
       this.balance += amount;
    }
    

    此方法的主要问题是无效数据。让我们解决它,并使用返回值来指示操作失败。

    function credit(amount) {
        if(!isInt(amount)) {
            return false;
        }
        this.balance += amount;
    }
    

    这是对前一个的改进,但客户端代码必须检查返回值以确保操作成功。对基本上系统中的每个方法执行此操作都会变得很麻烦。

    if(!johnDoe.credit(100)) {
        // do some error handling here
    }
    

    第三种方法,类似于第二种方法,是抛出异常。由于我们自己抛出异常,因此可能抛出特定类型的异常,而不是普通异常。

    function credit(amount) {
        if(!isInt(amount)) {
            throw new InvalidAmountError(amount);
        }
        this.balance += amount;
    }
    

    类似于抛出异常的第四种方法是在代码中使用断言。与上述方法相比的一个缺点是,由于断言是通用的,因此我们失去了抛出自定义异常的能力。尽管通过传递对象来抛出每个断言调用仍然是可能的。

    function credit(amount) {
        assert(!isInt(amount), "Amount to credit is not an integer");
        this.balance += amount;
    }
    

    全局assert函数易于编写,使代码更短。

    function assert(value, message) {
        if(value !== true) {
            throw new AssertionError(message);
        }
    }
    
    function AssertionError(message) {
        this.message = message;
    }
    
    AssertionError.prototype.toString = function() {
        return 'AssertionError: ' + this.message;
    }
    

    在这些方法中,处理意外价值和不愉快路径的好方法是什么。这里没有提到任何其他可能有用的方法吗?

2 个答案:

答案 0 :(得分:3)

  

与上述相比的一个缺点   方法是因为断言是   通用,我们失去投掷的能力   自定义例外

不一定:

function assert(value,message,Exctype) {
    if(value !== true) throw new Exctype(message);
}

构造函数是函数。函数是一等值。随意传递它们。

答案 1 :(得分:3)

考虑用于报告错误的客户端日志记录框架,例如Log4js。可以在浏览器中记录消息(即信息,调试,警告,错误),或者通过Ajax将消息持久保存到服务器,具体取决于应用程序。

Log4js网站还提供list of other JavaScript logging frameworks

使用自定义异常示例的一种好方法是抛出异常并根据需要记录错误。