You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java后端抛出异常后,如何触发AJAX的error回调函数?

解决AJAX异常回调不触发的问题

这个问题我之前也碰到过,核心原因其实很简单:jQuery的$.ajax判断是否触发error回调,看的是HTTP响应状态码,而不是响应内容。你现在后端捕获异常后返回的是普通字符串,但HTTP状态码还是默认的200(成功状态),所以不管内容是错误还是成功,都会走到success里。要触发error回调,关键是让后端在捕获异常时返回非2xx的HTTP状态码,同时把异常信息传递给前端。

后端修改方案

方式1:手动设置响应状态码(适合普通Java Web/Spring MVC)

直接在捕获异常时,通过HttpServletResponse对象设置错误状态码(比如500代表服务器内部错误,400代表请求参数非法),然后返回异常信息:

public static String call(String input, HttpServletResponse response) { // 注意要注入HttpServletResponse
    try {
        // 无关逻辑,会触发异常
        return "Good job";
    } catch (Exception e) {
        // 设置500状态码
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        // 返回异常信息到响应体
        return e.getMessage();
    }
}

方式2:抛自定义异常(Spring框架更优雅的写法)

定义一个带状态码的自定义异常,然后在Controller方法中抛出,Spring会自动帮你设置响应状态码:

// 自定义异常类
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 指定500状态码
public class BusinessException extends RuntimeException {
    public BusinessException(String message) {
        super(message);
    }
}

// Controller方法修改
public static String call(String input) {
    try {
        // 无关逻辑,会触发异常
        return "Good job";
    } catch (Exception e) {
        // 抛出自定义异常,Spring自动返回500状态码和异常信息
        throw new BusinessException(e.getMessage());
    }
}

如果需要返回JSON格式的错误信息,可以结合@ResponseBody封装成对象:

@ResponseBody
public Map<String, Object> call(String input) {
    Map<String, Object> result = new HashMap<>();
    try {
        // 无关逻辑,会触发异常
        result.put("code", 200);
        result.put("message", "Good job");
        return result;
    } catch (Exception e) {
        throw new BusinessException(e.getMessage());
    }
}

前端AJAX修改

后端改完后,前端的$.ajax会自动触发error回调,你可以通过回调参数获取异常信息:

$.ajax({
    url: "/your-api-path",
    type: "POST", // 或GET,根据你的接口类型
    data: { input: "your-illegal-input" },
    success: function(response) {
        console.log("请求成功:", response);
    },
    error: function(xhr, status, errorMsg) {
        // 获取后端返回的异常信息
        const errorInfo = xhr.responseText;
        console.log("请求失败,错误信息:", errorInfo);
        // 也可以获取状态码
        console.log("HTTP状态码:", xhr.status);
        // 如果后端返回的是JSON,可解析成对象
        // const errorData = JSON.parse(xhr.responseText);
        // console.log("JSON格式错误信息:", errorData);
    }
});

关键总结

  • $.ajaxerror回调触发条件是HTTP状态码不在200-299范围内,和响应内容无关
  • 后端必须在捕获异常时设置非2xx的状态码,才能让前端走到error分支
  • 异常信息可以通过响应体传递,前端在error回调中通过xhr.responseText(或xhr.responseJSON)获取

内容的提问来源于stack exchange,提问作者user9565299

火山引擎 最新活动