如何处理实用程序函数抛出的多个错误?

时间:2015-05-03 15:15:57

标签: javascript error-handling try-catch user-experience coding-style

我有一个函数examples(a,b,c,…)。每个参数都会抛出错误。所有这些都以同样的方式处理。我猜examples([array])属于同一类别。

在我的代码中,我现在有类似的东西:

  for (i = 0; i < len; i++) {
    try { this.example(arg[i]) }
    catch (e) { log(e) }
  }

从用户的角度来看,我希望能够一次看到所有参数的错误,而不是修复一个,然后发现下一个等等。但是我最终抓住了自己,对我而言,对于一个实用工具来说,这似乎是不可取的功能

有没有办法立即重新提出所有错误?

最佳做法是什么?

如果有标准,为什么要推荐?

1 个答案:

答案 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完全水平。