Javascript jQuery方法抛出新错误-未被外部try/catch块捕获
我开始向javascript对象添加错误处理,这些对象通常使用jQuery。 我遇到的问题是,当我从jQuery方法中抛出新错误时(包装jQuery调用的catch语句没有捕捉到它),它只是抛出标准错误,但不会作为日志消息登录到控制台。下面是一个例子:Javascript jQuery方法抛出新错误-未被外部try/catch块捕获,javascript,jquery,error-handling,javascript-objects,Javascript,Jquery,Error Handling,Javascript Objects,我开始向javascript对象添加错误处理,这些对象通常使用jQuery。 我遇到的问题是,当我从jQuery方法中抛出新错误时(包装jQuery调用的catch语句没有捕捉到它),它只是抛出标准错误,但不会作为日志消息登录到控制台。下面是一个例子: var MyNamespace = MyNamespace || {}; MyNamespace.Page = function() {}; MyNamespace.Page.prototype = { callPage : fun
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
块
考虑以下等效示例:
try {
var foo = function() {
throw new Error("foo error");
}
}
catch (error) {
}
foo();
您不会仅仅因为定义foo
时执行在try
块内,就期望捕获调用foo
所导致的错误
一种解决方案当然是在可能抛出的函数体内部使用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);
}
);
);
我懂了。我来自PHP背景,它同步处理所有事情——因此我对这个主题有误解。感谢您的澄清-您认为通过创建在try/catch块中执行回调函数的错误处理函数是一个好的替代方法吗?我的意思是说函数tryCatch(callback){try{callback();}catch(error){console.log(error);}?@SpencerMark:这要看情况。如果错误处理程序将被大量重用,这可能是一个好主意,否则将try/catch内联编写会更简单,也不会更糟。请注意,建议的
tryCatch
需要更多的参与(它应该保留这个并转发任何参数),请参阅上面我的catchIfException
。谢谢Jon-非常感谢您的帮助。我是否需要单独使用handler,还是可以直接从catchIfException()的catch语句中将错误记录到控制台?或者,如果指定了条件,则进行条件检查,如果指定了条件,则使用条件检查-否则只需记录?@SpencerMark:我真的不能说,因为所有这些都取决于您的具体情况。