gpt4 book ai didi

javascript - jQuery 方法抛出新错误 - 未被外部 try/catch block 捕获

转载 作者:行者123 更新时间:2023-11-29 19:39:14 25 4
gpt4 key购买 nike

我开始向经常使用 jQuery 的 javascript 对象添加错误处理。我遇到的问题是,当我从 jQuery 方法中抛出新错误时 - 它没有被包装 jquery 调用的 catch 语句捕获 - 它只是抛出标准错误,但不会作为日志消息登录到控制台。这是一个例子:

var MyNamespace = MyNamespace || {};

MyNamespace.Page = function() {};

MyNamespace.Page.prototype = {

callPage : function() {

"use strict";

$(document).on('change', 'select', function(event) {

event.preventDefault();
event.stopPropagation();

throw new Error('callPage method failed');

});

},

init : function() {

"use strict";

try {

this.callPage();

} catch(errorMessage) {

console.log('Error : ' + errorMessage);

}

}

};

当我用 try/catch 包装回调函数的内容时 - 然后它起作用了:

$(document).on('change', 'select', function(event) {

try {

event.preventDefault();
event.stopPropagation();

throw new Error('callPage method failed');

} catch(errorMessage) {

console.log('Error : ' + errorMessage);

}

});

知道如何简化它以及它为什么会这样吗?

最佳答案

在第一个示例中,try/catch 保护设置事件处理程序 的代码,而不是事件处理程序本身的主体。该代码在事件被触发之前不会运行,此时执行早已离开 try block 。

考虑这个等效的例子:

try {
var foo = function() {
throw new Error("foo error");
}
}
catch (error) {
}

foo();

您不会期望调用 foo 引起的错误会被捕获,因为当时 foo 被定义执行在 try 中> 阻止。

一种解决方案当然是在可能抛出的函数体内使用 try/catch,如您所示。另一种解决方案是创建一个可重用的“捕获包装器”函数,可能像这样:

function catchIfException(func, handler) {
return function() {
try {
var args = Array.prototype.slice.call(arguments);
func.apply(this, args);
}
catch (error) {
handler(error);
}
};
}


$(document).on('change', 'select',
catchIfException(
function(event) {
event.preventDefault();
event.stopPropagation();

throw new Error('callPage method failed');
},
function(error) {
console.log("error: " + error);
}
);
);

关于javascript - jQuery 方法抛出新错误 - 未被外部 try/catch block 捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24055425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com