4

预期的错误是我在代码中预期甚至自己提出的来自服务器的错误。例如,当用户尝试执行他没有足够权限的操作时,我会使用描述错误的消息引发PermissionError(自定义)。Exception

我一直在寻找一种处理 AJAX 情况的预期错误的好方法。唯一的要求是能够向用户显示错误消息,因为我想让我的用户了解正在发生的事情。

我目前的方法是将错误消息打包成 JSON 对象并将其发送回客户端

var ajaxResponse = $.ajax({
    ....        
});

ajaxResponse.done(function(jsonObj) {
    if (jsonObj.success) {
        /* no error, do something */    
    }
    else {
        /* expected error returned, display jsonObj.error to user */
    }
});

ajaxResponse.fail(function(jqXHR, textStatus, errorThrown) {
    /* unexpected error returned */
});

我有另一种方法,我不确定。基本上,不是将预期错误消息打包到 JSON 对象中,而是在我的 django 代码中返回HttpResponse(content="no sufficient privilege", status=403). 客户端 jQuery 将被修改如下:

ajaxResponse.done(function(response_data) {
    /* no error, do something */
});

ajaxResponse.fail(function(jqXHR, textStatus, errorThrown) {
    /* both expected and unexpected error would end up here.
     * It's an expected error when error code is 403 and 
     * jqXHR.responseText would give me the error message to 
     * display to the user.
     */
});

我喜欢第二种方法如何将所有预期或意外的错误集中在一个地方。但是,我有一种感觉,不应该这样使用http状态码。无论如何,我想知道哪一个是正确的方法。如果两者都不是,请分享你会做什么。

4

3 回答 3

3

有这样的全局配置 -

$.ajaxSetup({

     error: function(xhr){
         /* Do something with xhr.responseText */
         window.status='Your error message goes here';
     }

});
于 2012-04-20T21:39:45.617 回答
1

jqXHR 对象包含有关失败响应的所有信息。首先请允许我简化您提出请求的方式:

 $.ajax({
        url: '/the/posting/url',
        type: 'POST',
        data: { param: value, param_two: value_two},
        success: function(){
            alert('Everything went as is supposed to be.');
        },
        error: function(jqXHR, t, e){
            console.log(jqXHR.responseText);
        }
    })

因此,通过这种方式,您可以管理您想要执行的操作,无论请求是否良好。然后你看我写了类似的东西:

console.log(jqXHR.responseText);

那是因为该属性会告诉您详细的错误(取决于您在出现问题时如何放置跟踪)。您可以在 Firebug (Firefox) 或开发者工具(Chrome 和 Safari)的控制台中阅读它。

无需将对象序列化为 json 即可知道出了什么问题,因为 django(我想)按原样发送错误,并且错误。所以当 jquery 知道有什么地方出错时,它会触发 ajax 对象的 error 属性,就是这样,你可以在控制台中读取。

于 2012-04-20T21:32:32.527 回答
0

我个人总是使用方法一,特别是因为错误条件比 http 错误代码多。如果您使用第二种方法,也可能存在您的 js 代码无法区分预期错误和意外错误的情况。

于 2012-04-20T21:29:34.713 回答