10

当错误确实发生并且函数无法继续前进时,什么是报告 JavaScript 错误而不是依赖空值和未定义的好方法。我可以想到三种方法:

  1. 没做什么
  2. 抛出异常
  3. 断言

这是一个简单的示例场景 - 一个将传入金额记入用户帐户的函数。该函数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;
}

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

4

2 回答 2

3

与上述方法相比,一个缺点是由于断言是通用的,我们失去了抛出自定义异常的能力

不必要:

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

构造函数是函数。函数是一流的值。随意传递他们。

于 2010-07-17T01:39:40.470 回答
3

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

Log4js 站点还提供了其他 JavaScript 日志框架的列表

使用您的自定义异常示例的一个好方法是抛出异常并在您认为合适的时候记录错误。

于 2010-07-17T01:58:09.470 回答