我有一个函数examples(a,b,c,…)
。每个参数都会抛出错误。所有这些都以同样的方式处理。我猜examples([array])
属于同一类别。
在我的代码中,我现在有类似的东西:
for (i = 0; i < len; i++) {
try { this.example(arg[i]) }
catch (e) { log(e) }
}
从用户的角度来看,我希望能够一次看到所有参数的错误,而不是修复一个,然后发现下一个等等。但是我最终抓住了自己,对我而言,对于一个实用工具来说,这似乎是不可取的功能
有没有办法立即重新提出所有错误?
最佳做法是什么?
如果有标准,为什么要推荐?
答案 0 :(得分:2)
你可以throw
几乎任何东西,但你可能会发现使用自定义错误类型有更多可操作性
function ErrorCollection(msg) {
this.name = 'ErrorCollection';
this.message = msg || '';
this.errors = [];
}
ErrorCollection.prototype = Object.create(Error.prototype);
ErrorCollection.prototype.constructor = ErrorCollection;
ErrorCollection.prototype.push = function (e) {
return this.errors.push(e);
}
// ...
var i, ec = new ErrorCollection();
for (i = 0; i < 10; ++i) {
try {
throw new Error('Error ' + i);
} catch (e) {
ec.push(e);
}
}
// do something with ec, e.g.
if (ec.errors.length) {
console.log(ec, ec.errors);
throw ec;
}
停止第一个错误然后检查剩余部分的有效性
的示例var i, a = [];
for (i = 0; i < arguments.length; ++i) {
try { // assume everything will work
this.example(arguments[i]);
} catch (e) { // our assumption was wrong
a.push({arg: i, val: arguments[i]});
for (++i; i < arguments.length; ++i) { // loop from where we left off
if (!this.valid_arg(arguments[i])) { // some costly test
a.push({arg: i, val: arguments[i]});
}
}
throw a; // throw the list of bad args up a level
}
}
如果有效性测试很快/成本不高,那么您可以考虑在主循环之前进行,而不是等待第一个错误,因为您应该能够避免try..catch
完全水平。