如何获取await $.ajax捕获到的异常详情?
如何获取await $.ajax捕获到的异常详情?
我来帮你捋清楚这个问题~你现在用await $.ajax在try/catch里抓到的其实不是普通的Error对象,而是XMLHttpRequest(XHR)实例本身,这就是为什么err.message会是undefined的原因——它压根就不是标准错误对象,自然没有message属性。
要拿到像传统error回调里那样的详细错误信息,有两种简单的处理方式:
方式一:直接从捕获到的XHR对象中提取信息
既然catch到的是XHR实例,那我们可以直接从它身上读取关键的错误字段:
status: HTTP状态码(比如404、500、0代表跨域/请求中断)statusText: 状态对应的可读文本(比如"Not Found"、"Internal Server Error")responseText/responseJSON: 后端返回的自定义错误内容(如果有的话)
修改你的catch代码就行:
catch (xhrErr) { LoadingEnd(); // 拼接成可读的错误信息 const errorMsg = `请求失败:[${xhrErr.status}] ${xhrErr.statusText}`; console.error('MyFunction', errorMsg); // 如果后端返回了JSON格式的错误详情,也可以解析出来 if (xhrErr.responseJSON) { console.error('自定义错误详情:', xhrErr.responseJSON); } else if (xhrErr.responseText) { console.error('响应文本:', xhrErr.responseText); } }
这样就能拿到和传统error回调里类似的核心信息了。
方式二:封装$.ajax,让它抛出包含完整信息的自定义错误
如果你想让catch到的就是带有message的标准Error对象,还能顺便拿到textStatus、errorThrown这些传统参数,可以自己封装一个支持await的ajax函数:
// 封装一个支持await的ajax工具函数 function ajaxAwait(options) { return new Promise((resolve, reject) => { $.ajax(options) .done(resolve) .fail((xhr, textStatus, errorThrown) => { // 创建自定义Error对象,把所有信息都塞进去 const customErr = new Error(`${textStatus}: ${errorThrown}`); // 附加原始xhr对象和其他参数 customErr.xhr = xhr; customErr.textStatus = textStatus; customErr.errorThrown = errorThrown; reject(customErr); }); }); }
然后在代码里用这个封装好的函数:
try { LoadingStart(); const result = await ajaxAwait({ type: 'Get', url: url, data: data, }); LoadingEnd(); window.location.replace(result.redirectUrl); } catch (err) { LoadingEnd(); // 现在就能直接拿到message了 console.error('MyFunction', err.message); // 也能随时获取原始xhr信息 console.log('原始请求详情:', err.xhr); }
这样处理后,catch到的就是符合你预期的、带可读message的错误对象,同时还保留了所有原始信息。
为什么会出现这种情况?其实是jQuery的Deferred对象的特性:当$.ajax失败时,它的fail回调会传入三个参数(xhr、textStatus、errorThrown),但Promise的reject只能传递一个参数,所以当你用await直接调用$.ajax时,只会捕获到第一个参数也就是xhr对象,这就是你之前看到的那个大对象的原因。
备注:内容来源于stack exchange,提问作者Kevin Burton
相关产品推荐
相关产品推荐

