0

我已经构建了一个 javascript 函数,它将多个 ajax 函数合并到一个请求中。对于每个请求,几乎总是有一个回调函数。捆绑的函数一次调用一个回调函数。

我用 try catch 将它们包围起来,以防止一个函数阻止其他函数运行。但是,我仍然希望浏览器通知我有关 javascript 错误的信息。我怎样才能做到这一点?

我已经为我在这里尝试做的事情树立了一个例子。

来自上面 jsfiddle 链接的代码:

<script>
function doSomeStuff() {
    for (var i in arguments) {
        try { 
            arguments[i].apply(this);
        }
        catch (e) {
            throw e;
        }
    }
}

doSomeStuff(function() { console.log("i'm an apple"); }, 
    function() { imnotavariable = test; },
    function() { console.log("i'm an apple too"); });
</script>

问题摘要:如何捕获错误,同时仍将其报告给浏览器?

4

2 回答 2

3

如果您希望循环完成(即调用所有函数),则不能在其中抛出错误。实现您想要的一种方法是保存错误并在循环之后将其抛出,即

var error = null;
for (...) {
  try {
    ...
  }
  catch(e) {
    error = e;
  }
}
if(error != null) { throw error; }

不过,这只会传播最后一个错误。如果你想捕获所有发生的错误,你需要将它们合并成一个你可以再次抛出的错误。

汤姆的替代解决方案

您还可以在 上设置超时,throw这样它就不会干扰函数的执行。

function doSomeStuff() {
  for (var i in arguments) {
    try { 
      arguments[i].apply(this);
    }
    catch (e) {
      setTimeout(function() { throw e; }, 100);
    }
  }
}
于 2013-03-22T13:48:31.407 回答
0

您需要通过“仍向浏览器报告”来定义您的意思。

简短的回答可能是,如果你有一些备用的日志系统,你可以尝试做类似的事情:

    var apperrors;

    function appLog(error){
        apperrors = apperrors || [];
    
        apperrors.push(error);
       //maybe trigger an app error event?
    }
    
    function doSomeStuff() {
        for (var i in arguments) {
            try { 
                arguments[i].apply(this);
            }
            catch (e) {
                appLog(e);
            }
        }
    }

然后对你的错误做点什么。不过,您并没有真正描述那是什么。

编辑

在下面的评论之后:如果你发现错误,我可以看到你有三个行动方案:

  • 忽略它(这很糟糕)
  • 重新抛出它并做一些额外的事情(即因为你想更优雅地通知用户)
  • 或捕获错误,并以其他不那么激进的方式处理它

如果你重新抛出错误,除非你做一些“额外的”事情,否则你不会获得任何东西。

于 2013-03-22T13:50:07.820 回答