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); } });
关键总结
$.ajax的error回调触发条件是HTTP状态码不在200-299范围内,和响应内容无关- 后端必须在捕获异常时设置非2xx的状态码,才能让前端走到
error分支 - 异常信息可以通过响应体传递,前端在
error回调中通过xhr.responseText(或xhr.responseJSON)获取
内容的提问来源于stack exchange,提问作者user9565299




