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