Javascript jQuery方法抛出新错误-未被外部try/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

我开始向javascript对象添加错误处理,这些对象通常使用jQuery。 我遇到的问题是,当我从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

考虑以下等效示例:

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:我真的不能说,因为所有这些都取决于您的具体情况。