表示失败的JavaScript反静默技术
-
16-09-2020 - |
题
什么是在JavaScript中报告错误而不是依赖null的好方法,以及在错误确实发生并且函数无法继续前进时未定义。我可以想到三种方法:
- 什么都不做
- 抛出异常
- 断言
这是一个简单的示例场景-一个将传入的金额贷记用户帐户的函数。的功能 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);
}
构造函数是函数。函数是第一类值。随便把他们传过去。
不隶属于 StackOverflow