可能从Ajax成功事件中抛出新错误?

时间:2012-02-29 16:15:41

标签: javascript jquery ajax

在服务器端(PHP)抛出的任何错误都会在哈希中捕获并通过AJAX发送回客户端(javascript)。通过这种方式,错误的JSON实际上被传递给AJAX成功事件。

...
catch ($e) {
    echo ( array("error" => $e->getMessage()) );
}

我基本上检查数据[“error”]是否未定义,如果没有,我想抛出一个新错误,理论上会在我的try / catch块中捕获封装整个AJAX。

...
success : function(data) {
    if (typeof(data["error"]) != "undefined") {
        throw new Error(data["error"]);
    }

    handleGoodData(data);
}

它一直告诉我错误未被捕获(通过Chrome控制台)。我已经检查过,如果定义了数据,那么data [“error”]会返回一个字符串。

即使是最简单的形式,只是在成功事件中抛出一个新错误似乎也不起作用:

success : function(data) {
    throw new Error("error message!");
}

2 个答案:

答案 0 :(得分:2)

你必须在try catch块中实际封装你的成功和错误函数,以便能够捕获它们中的错误。一种解决方案是在$ .ajax调用之间创建一个层,以便它首先通过您自己的函数。例如:

myajax: function(settings) {

            // override provided success callback with try catch
            if (settings.success){
                var successFunc = settings.success;
                settings.success = function(){
                    try{
                        successFunc.call(arguments);
                    }
                    catch(error){
                        console.log("An unhandled error occurred in ajax success callback: " + error);
                    }
                };
            }

            // override provided error callback with try catch
            if (settings.error) {
                var errorFunc = settings.error;
                settings.error = function() {
                    try{
                        errorFunc.call(arguments);
                    }
                    catch(error){
                        console.log("An unhandled error occurred in ajax error callback: " + error);
                    } 
                };
            }
            // else create our own basic error callback
            else {
                settings.error = function(jqXHR, textStatus, errorThrown) {
                    console.log("An unhandled error occurred during an AJAX call: " + errorThrown);
                };
            }


            $.ajax(settings);
        }
    };

答案 1 :(得分:0)

问题是,jQuery本身用.ajax()块封装了try/catch例程的部分内容。所以我的猜测是你的错误会被其中一个阻挡。

您可以使用jQuery.error('error message!');

解决此问题

参考:jQuery.error