【问题标题】:Javascript Catch, but Still Throw ErrorJavascript Catch,但仍然抛出错误
【发布时间】:2013-03-12 09:30:34
【问题描述】:

我已经构建了一个 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>

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

【问题讨论】:

    标签: javascript try-catch throw


    【解决方案1】:

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

    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);
        }
      }
    }
    

    【讨论】:

    • 好的,我会把它添加到答案中。
    【解决方案2】:

    您需要定义“仍然向浏览器报告”的含义。

    简短的回答可能是,如果您有一些备用的日志记录系统,您可以尝试执行类似的操作:

        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);
                }
            }
        }
    

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

    编辑

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

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

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

    【讨论】:

    • Stil 报告意味着 Chrome 会吐出通常的错误消息,Internet Explorer 仍然会在左下角发送无用的 javascript 错误图标,而 firefox 仍然会这样做。不阻止代码运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多