Javascript捕获,但仍然抛出错误

Javascript捕获,但仍然抛出错误,javascript,try-catch,throw,Javascript,Try Catch,Throw,我构建了一个javascript函数,它将多个ajax函数合并到一个请求中。对于每个请求,几乎总是有一个回调函数。捆绑函数一次调用一个回调函数 我用try-catch来阻止一个函数阻止其他函数运行。但是,我仍然希望浏览器通知我javascript错误。我该怎么做 我已经为自己的努力树立了榜样 上面JSFIDLE链接中的代码: <script> function doSomeStuff() { for (var i in arguments) { try {

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

我用try-catch来阻止一个函数阻止其他函数运行。但是,我仍然希望浏览器通知我javascript错误。我该怎么做

我已经为自己的努力树立了榜样

上面JSFIDLE链接中的代码:

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

函数doSomeStuff(){
for(参数中的变量i){
试试{
参数[i]。应用(此);
}
捕获(e){
投掷e;
}
}
}
doSomeStuff(function(){console.log(“我是苹果”);},
函数(){imnotaviable=test;},
function(){console.log(“我也是苹果”);});

问题摘要:如何在仍向浏览器报告错误的情况下捕获错误?

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

var error = null;
for (...) {
  try {
    ...
  }
  catch(e) {
    error = e;
  }
}
if(error != null) { throw error; }
但这只会传播最后一个错误。如果要捕获所有发生的错误,需要将它们合并为一个单独的错误,然后再次抛出

汤姆的替代方案 您还可以在
抛出
上设置超时,以便它不会干扰函数的执行

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

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

var error = null;
for (...) {
  try {
    ...
  }
  catch(e) {
    error = e;
  }
}
if(error != null) { throw error; }
但这只会传播最后一个错误。如果要捕获所有发生的错误,需要将它们合并为一个单独的错误,然后再次抛出

汤姆的替代方案 您还可以在
抛出
上设置超时,以便它不会干扰函数的执行

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

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

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

    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);
            }
        }
    }
然后对你的错误做点什么。但你并没有真正描述那是什么

编辑 下面的评论是:如果你发现了错误,我可以看到你有三个行动方案:

  • 忽略它(那很糟糕)
  • 重新播放并执行其他操作(例如,因为您希望更优雅地通知用户)
  • 或者捕捉错误,并以其他不那么激进的方式处理它

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

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

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

    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仍然会这样做。在不阻止代码运行的情况下。Stil报告意味着Chrome会发出通常的错误消息,internet explorer仍然会发送左下角无用的javascript错误图标,firefox仍然会这样做。不会阻止代码运行。当然,我会将其添加到答案中。当然,我会将其添加到答案中。