如何处理AJAX中的预期错误(包括向用户公开)

预期的错误是我预期甚至在代码中自己提出的服务器中的错误。 例如,当用户尝试执行他没有足够权限的操作时,我会使用描述错误的消息引发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状态代码。 无论如何,我想知道哪一个是正确的方法。 如果两者都没有,请分享你会做什么。

有这样的全局配置 –

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

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属性,就是这样,你可以在控制台中读取。

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