在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;
}
在这些方法中,处理意外价值和不愉快路径的好方法是什么。这里没有提到任何其他可能有用的方法吗?
答案 0 :(得分:3)
与上述相比的一个缺点 方法是因为断言是 通用,我们失去投掷的能力 自定义例外
不一定:
function assert(value,message,Exctype) {
if(value !== true) throw new Exctype(message);
}
构造函数是函数。函数是一等值。随意传递它们。
答案 1 :(得分:3)
考虑用于报告错误的客户端日志记录框架,例如Log4js。可以在浏览器中记录消息(即信息,调试,警告,错误),或者通过Ajax将消息持久保存到服务器,具体取决于应用程序。
Log4js网站还提供list of other JavaScript logging frameworks。
使用自定义异常示例的一种好方法是抛出异常并根据需要记录错误。