【问题标题】:How to handle multiple errors thrown by an utility function?如何处理实用程序函数引发的多个错误?
【发布时间】:2015-05-03 15:15:56
【问题描述】:

我有一个函数examples(a,b,c,…)。每个参数都可能引发错误。所有这些都以相同的方式处理。我猜examples([array]) 应该属于同一类。

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

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

从用户的角度来看,我希望能够一次看到所有参数的错误,而不是修复一个然后发现下一个等。但我最终发现了自己,在我看来,这对于实用程序来说并不理想函数。

有没有办法一次性重新抛出所有个错误?

最佳做法是什么?

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

【问题讨论】:

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


    【解决方案1】:

    你可以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 .

    【讨论】:

    • 这是一种不错的方法,但如果我只有一个错误,这似乎毫无用处。
    • @Knu 所以如果你的for 循环如果len1,但我们这样做的原因是抽象的情况,而不是具体的情况
    • 如何投掷并不是我要问的唯一问题。我需要知道即使第一个参数抛出错误,它是否应该处理其他参数。用户会想要吗?我愿意。
    • @Knu 我想这取决于this.example 做了什么以及是否有其他方法来验证参数,即您需要问自己“我的代码是否需要立即停止以防止出现意外结果? "如果答案是否定的,让它们堆积起来然后扔掉。如果答案是肯定的,要么停止第一个,要么考虑是否有一种简单的方法可以在不调用 this.example 的情况下验证其余参数
    • 这是一个品味问题,这就是我询问约定的原因。它与用户体验有关,而不是代码。
    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多