全局异常处理 一、什么是全局异常处理1. 概念程序运行出错比如空指针、文件上传失败、数据库错误会抛出异常。全局异常处理统一捕捉项目中所有 Controller 出现的异常然后给前端返回友好、统一的错误提示而不是一堆看不懂的报错代码。2. 为什么要用不用每个接口都写try-catch异常统一管理代码更整洁给前端返回规范格式code、msg、data提升用户体验3. 核心注解RestControllerAdvice作用开启全局异常捕获增强所有 ControllerExceptionHandler作用指定捕获哪种异常二、全局异常处理实现步骤步骤 1创建一个专门处理异常的类在项目里新建包exception新建类GlobalExceptionHandler.java步骤 2复制下面代码java运行import com.demo.utils.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 全局异常处理器 * 捕获所有Controller的异常统一返回友好提示 */ Slf4j RestControllerAdvice // 开启全局异常捕获 public class GlobalExceptionHandler { // 1. 捕获所有异常兜底 ExceptionHandler(Exception.class) public Result ex(Exception e) { log.error(全局异常{}, e.getMessage(), e); // 打印异常日志 return Result.error(服务器繁忙请稍后再试); } // 2. 捕获空指针异常 ExceptionHandler(NullPointerException.class) public Result nullEx(NullPointerException e) { log.error(空指针异常{}, e.getMessage(), e); return Result.error(操作失败对象不能为空); } // 3. 捕获运行时异常自定义异常常用 ExceptionHandler(RuntimeException.class) publicResult runtimeEx(RuntimeException e) { log.error(业务异常{}, e.getMessage(), e); return Result.error(e.getMessage()); } // 4. 文件上传异常 ExceptionHandler(java.io.IOException.class) public Result ioEx(Exception e) { log.error(文件上传异常{}, e.getMessage(), e); return Result.error(文件上传失败); } }三、核心说明1. 执行顺序接口报错→ 被RestControllerAdvice捕获→ 匹配ExceptionHandler(异常类型)→ 返回友好提示2. 异常匹配规则精确优先比如发生NullPointerException→ 优先走NullPointerException处理→ 没有才走Exception3. 日志非常重要java运行log.error(异常信息{}, e.getMessage(), e);作用控制台能看到完整错误堆栈方便你排查 BUG四、怎么用以后在业务代码里直接抛异常就行不用 try-catch例子java运行if(user null){ throw new RuntimeException(用户不存在); }全局异常会自动捕获返回给前端json{ code: 0, msg: 用户不存在, data: null }五、项目里能直接用的最终版java运行Slf4j RestControllerAdvice public class GlobalExceptionHandler { // 捕获所有异常 ExceptionHandler(Exception.class) public Result handleAllException(Exception e) { log.error(系统异常, e); return Result.error(操作失败 e.getMessage()); } }六、总结全局异常处理 统一捕获错误 返回友好提示两个核心注解RestControllerAdvice开启全局捕获ExceptionHandler捕获指定异常业务代码直接throw new RuntimeException(提示信息)异常会被自动捕捉代码再也不用满屏 try-catch