代码之家  ›  专栏  ›  技术社区  ›  Anurag

javascript反静音技术,用于指示故障

  •  10
  • Anurag  · 技术社区  · 15 年前

    在javascript中报告错误的一个好方法是什么,而不是依赖于空值,以及当错误确实发生并且函数无法继续前进时取消定义。我可以想到三种方法:

    1. 什么也不做
    2. 引发异常
    3. 断言

    下面是一个简单的示例场景-一个函数,它向用户帐户贷记传入的金额。函数 credit 是一部分 Account 对象。

    这是一个天真的解决方案。

    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 回复  |  直到 15 年前
        1
  •  3
  •   Chocula    15 年前

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

    log4js站点还提供 list of other JavaScript logging frameworks .

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

        2
  •  3
  •   Weston C    15 年前

    与上述相比有一个缺点 方法是这样的,因为断言是 一般,我们失去了投掷的能力 自定义异常

    不一定:

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

    构造函数是函数。函数是第一类值。请随意传给他们。