什么是报告JavaScript中的错误而不是依赖于null的好方法,以及当错误发生且函数无法继续前进时的未定义.我可以想到三种方法:
这是一个简单的示例场景 - 一个函数,用于记入传入的用户帐户.该函数credit是Account对象的一部分.
这是天真的解决方案.
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 …Run Code Online (Sandbox Code Playgroud) 我还没有用它来编写单元测试,我想在一个完整的小工具框架上做这个(使它更安全使用).这样,我肯定会学到更多关于单元测试的知识,而不是我到目前为止学到的东西.
然而,我真的习惯于系统地添加断言,我发现有一个上下文可以确定(在最终版本中被删除).主要是作为函数实现的前提条件,每次我检索必须正确的信息(比如着名示例的C/C++指针有效性).
现在我问:当你进行单元测试时,断言是多余的吗?因为当你测试一些代码的行为时它看起来很冗余; 但同时它与执行环境不同.
我应该两个都做吗?