You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:43:02