JavaScript反静音技术表明失败

Anu*_*rag 10 javascript error-handling defensive-programming assert

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

  1. 没做什么
  2. 抛出一个例外
  3. 断言

这是一个简单的示例场景 - 一个函数,用于记入传入的用户帐户.该函数creditAccount对象的一部分.

这是天真的解决方案.

function credit(amount) {
   this.balance += amount;
}
Run Code Online (Sandbox Code Playgroud)

这种方法的一个主要问题是无效数据.让我们修复它,并使用返回值来指示操作失败.

function credit(amount) {
    if(!isInt(amount)) {
        return false;
    }
    this.balance += amount;
}
Run Code Online (Sandbox Code Playgroud)

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

if(!johnDoe.credit(100)) {
    // do some error handling here
}
Run Code Online (Sandbox Code Playgroud)

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

function credit(amount) {
    if(!isInt(amount)) {
        throw new InvalidAmountError(amount);
    }
    this.balance += amount;
}
Run Code Online (Sandbox Code Playgroud)

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

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

全局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;
}
Run Code Online (Sandbox Code Playgroud)

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

Cho*_*ula 3

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

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

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