Javascript Catch,但仍然丢失错误

时间:2013-03-22 13:40:27

标签: javascript try-catch throw

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

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

我已经举例说明了我要做的事情here

上面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>

问题摘要:如何在仍然向浏览器报告错误的同时发现错误?

2 个答案:

答案 0 :(得分:3)

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

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

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

Tom的替代解决方案

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

function doSomeStuff() {
  for (var i in arguments) {
    try { 
      arguments[i].apply(this);
    }
    catch (e) {
      setTimeout(function() { throw e; }, 100);
    }
  }
}

答案 1 :(得分: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);
            }
        }
    }

然后对你的错误做点什么。你并没有真正描述那些东西。

修改

按照以下评论:如果您发现错误,您可以看到三个操作过程:

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

我重新抛出你没有获得任何东西的错误,除非你做了'额外'的事情。