当错误确实发生并且函数无法继续前进时,什么是报告 JavaScript 错误而不是依赖空值和未定义的好方法。我可以想到三种方法:
- 没做什么
- 抛出异常
- 断言
这是一个简单的示例场景 - 一个将传入金额记入用户帐户的函数。该函数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;
}
在这些方法中,什么是处理意外值和不愉快路径的好方法。这里没有提到其他有用的方法吗?