干货 | SpringBoot 全局异常拦截到底怎么用(附完整可复制代码)
一、前言开发接口最烦啥代码一报错前端直接抛一堆 500 红码、后台堆栈日志满天飞、用户看页面一脸懵。要是每个接口都手动 try-catch代码又臭又长、冗余到想吐。Spring 全局异常拦截就是用来根治这个问题的一次配置、全局生效所有接口报错统一抓、统一格式化、统一返回友好提示干净又专业。二、核心原理大白话用 Spring 自带注解RestControllerAdviceExceptionHandler拦截所有 Controller 抛出来的异常不改动业务代码自动接管报错把乱七八糟的异常转成前端能看懂的标准 JSON三、第一步先搞统一返回体项目通用/** * 全局统一返回结果 */ public class ResultT { private Integer code; // 状态码 private String msg; // 提示信息 private T data; // 返回数据 // 无参构造 public Result() { } // 全参构造 public Result(Integer code, String msg, T data) { this.code code; this.msg msg; this.data data; } // 成功只返回数据 public static T ResultT success(T data) { ResultT r new Result(); r.setCode(200); r.setMsg(操作成功); r.setData(data); return r; } // 成功自定义提示信息 数据 public static T ResultT success(String msg, T data) { ResultT r new Result(); r.setCode(200); r.setMsg(msg); r.setData(data); return r; } // 失败 public static T ResultT error(Integer code, String msg) { ResultT r new Result(); r.setCode(code); r.setMsg(msg); return r; } // 默认失败 public static T ResultT error(String msg) { return error(500, msg); } // GETTER SETTER public Integer getCode() { return code; } public void setCode(Integer code) { this.code code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg msg; } public T getData() { return data; } public void setData(T data) { this.data data; } Override public String toString() { return Result{ code code , msg msg \ , data data }; } }四、第二步自定义业务异常自己抛自己用/** * 自定义业务异常 */ public class BizException extends RuntimeException{ private Integer code; public BizException(Integer code,String msg){ super(msg); this.code code; } public Integer getCode() { return code; } }五、核心重头戏全局异常拦截器直接复制用import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 全局统一异常处理 */ RestControllerAdvice public class GlobalExceptionHandler { // 1.捕获自己手动抛的业务异常 ExceptionHandler(BizException.class) public Result? bizException(BizException e){ return Result.error(e.getCode(),e.getMessage()); } // 2.捕获参数校验异常比如必填为空、格式错误 ExceptionHandler(MethodArgumentValidException.class) public Result? validException(MethodArgumentValidException e){ return Result.error(400,参数异常e.getMessage()); } // 3.兜底所有没接住的未知异常 ExceptionHandler(Exception.class) public Result? allException(Exception e){ // 线上不要把原生错误抛给前端只给友好提示 e.printStackTrace(); //后台打印日志排错 return Result.error(500,服务器繁忙请稍后重试); } }六、业务代码怎么用超简单1. 正常判断直接抛异常if(user null){ throw new BizException(4001,用户不存在请重新登录); }2. 不用写任何 try-catch异常自动被全局拦截 → 自动封装成标准 JSON 返回前端。前端永远收到干净格式{ code: 4001, msg: 用户不存在请重新登录, data: null }七、到底解决了啥业务代码干净再也不用到处写 try-catch 套娃报错统一规范前端不用对接乱七八糟错误格式安全原生 Java 异常堆栈不暴露给前端防止泄露信息排错方便后台统一打印日志定位问题超快八、文末总结全局异常拦截说白了就是把项目里所有接口报错全部抓进一个地方统一收拾。自己业务报错就抛自定义异常系统报错就兜底隐藏细节。配置一次整个项目永久生效代码清爽、接口规范、面试还能说懂架构新手必学必用。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2483415.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!