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

标签 javascript jquery error-handling javascript-objects

我开始向经常使用 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/

相关文章:

javascript - 如何在等待 promise 解决时执行代码?

javascript - 加载时如何为下拉列表中的第一项运行 LoadPartial 函数?

javascript - 更新存储在 chrome 扩展本地存储中的对象

jquery - 具有默认选项卡的 shown.bs.tab 事件不起作用

java - 一个方法调用,多种可能的错误条件——如何在面向对象编程中管理它?

javascript - 根据数组元素更新矩阵

jquery - 如何输入类型文件允许从多个目录中选择多个图像并预览所有选定的图像

javascript - 将变量传递给函数时出错 javascript 不允许更改 CSS

json - React,AWS GraphQL错误处理-JSON响应

c# - 我正在创建一个数组,我想从构造函数中指定它的长度