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

  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;
}

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

有帮助吗?

解决方案

考虑一个客户端日志框架来报告错误,例如 Log4js.可以在浏览器中记录消息(即info,debug,warn,error),也可以通过Ajax将消息保存到服务器,具体取决于应用程序。

Log4js网站还提供了一个 其他JavaScript日志框架列表.

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

其他提示

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

不一定:

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

构造函数是函数。函数是第一类值。随便把他们传过去。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top