Spring全局异常处理

一、整体架构

java 复制代码
接口 BaseErrorInfoInterface   →   定义错误码规范
枚举 ResultCodeEnum            →   实现接口,统一管理错误码
自定义异常 SBException         →   运行时异常,携带业务错误码和消息
全局异常拦截 GlobalExceptionHandler  →  捕获所有异常,返回统一响应
统一返回体 Result              →   规范前后端交互 JSON 结构

二、组件配置

1.错误码接口

让所有错误码类(如枚举)有统一获取码和消息的方法,方便 SBException 构造器直接接收接口类型。

java 复制代码
public interface BaseErrorInfoInterface {  
    String getResultCode();  
    String getResultMsg();  
}

2.枚举错误码

  • 业务码命名最好见名知意,具体根据项目调整。
  • 错误码可以区分模块,比如 1001 用户模块,2001 订单模块。
java 复制代码
public enum ResultCodeEnum implements BaseErrorInfoInterface {  
    SUCCESS("200", "成功!"),  
    BODY_NOT_MATCH("400","请求的数据格式不符!"),  
    SIGNATURE_NOT_MATCH("401","业务异常!"),  
    NOT_FOUND("404", "未找到该资源!"),  
    INTERNAL_SERVER_ERROR("500", "服务器内部错误!"),  
    SERVER_BUSY("503","服务器正忙,请稍后再试!");  
  
    private final String code;  
    private final String message;  
    ResultCodeEnum (String code, String message) {  
        this.code = code;  
        this.message = message;  
    }  
  
    @Override  
    public String getResultCode() {  
        return code;  
    }  
  
    @Override  
    public String getResultMsg() {  
        return message;  
    }  
}

3.自定义异常

java 复制代码
@Getter  
public class SBException extends RuntimeException{  
    private static final long serialVersionUID = 1L;  
  
    private final String errCode;  
    private final String errMessage;  
    public SBException(BaseErrorInfoInterface baseErrorInfoInterface){  
        super(baseErrorInfoInterface.getResultMsg());  
        this.errCode = baseErrorInfoInterface.getResultCode();  
        this.errMessage = baseErrorInfoInterface.getResultMsg();  
    }  
    public SBException(BaseErrorInfoInterface baseErrorInfoInterface, Throwable cause){  
        super(baseErrorInfoInterface.getResultMsg(), cause);  
        this.errCode = baseErrorInfoInterface.getResultCode();  
        this.errMessage = baseErrorInfoInterface.getResultMsg();  
    }  
    public SBException(String errMessage){  
        super(errMessage);  
        this.errCode = ResultCodeEnum.INTERNAL_SERVER_ERROR.getResultCode();  
        this.errMessage = errMessage;  
    }  
    public SBException(String errCode, String errMessage){  
        super(errMessage);  
        this.errCode = errCode;  
        this.errMessage = errMessage;  
    }  
    public SBException(String errCode, String errMessage, Throwable cause){  
        super(errMessage, cause);  
        this.errCode = errCode;  
        this.errMessage = errMessage;  
    }  
}

4.全局异常处理

java 复制代码
@RestControllerAdvice  
@Slf4j  
public class GlobalExceptionHandler {  
    //业务问题  
    @ExceptionHandler(SBException.class)  
    public Result handleSBException(SBException e){  
        log.error("业务异常!信息:{}", e.getMessage());  
        return Result.fail(e.getErrCode(), e.getErrMessage());  
    }  
    //空指针  
    @ExceptionHandler(NullPointerException.class)  
    public Result handleNullPointerException(NullPointerException e){  
        log.error("空指针异常!信息:{}", e.getMessage());  
        return Result.fail(ResultCodeEnum. BODY_NOT_MATCH.getResultMsg());  
    }  
  
    //其他异常  
    @ExceptionHandler(Exception.class)  
    public Result handleException(Exception e){  
        log.error("异常!信息:{}", e.getMessage());  
        return Result.fail(ResultCodeEnum.INTERNAL_SERVER_ERROR.getResultMsg());  
    }  
}

5.同一返回

java 复制代码
@Data  
@AllArgsConstructor  
@NoArgsConstructor  
public class Result {  
    private Boolean success;  
    private String code;  
    private String errorMsg;  
    private Object data;  
    private Long total;  
  
    public static Result ok(){  
        return new Result(true, "200",null, null, null);  
    }  
    public static Result ok(Object data){  
        return new Result(true, "200",null, data, null);  
    }  
    public static Result ok(List<?> data, Long total){  
        return new Result(true, "200",null, data, total);  
    }  
    public static Result fail(String errorMsg){  
        return new Result(false, "401",errorMsg, null, null);  
    }  
    public static Result fail(String code, String errorMsg){  
        return new Result(false, code,errorMsg, null, null);  
    }  
}

三、测试

java 复制代码
@GetMapping("/getById")  
public Result getById(@RequestParam Integer id) {  
    familyMember familyMember = familyMemberService.getById(id);  
    if(familyMember != null){  
        return Result.ok(familyMember);  
    }else{  
        throw new SBException("401","八嘎雅鹿,没有这个人");  
    }  
}
java 复制代码
2026-05-19 13:52:59.983 ERROR 23004 --- [nio-8080-exec-3] c.g.xcq.config.GlobalExceptionHandler    : 业务异常!信息:八嘎雅鹿,没有这个人
2026-05-19 13:52:59.986  WARN 23004 --- [nio-8080-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.good.xcq.exception.SBException: 八嘎雅鹿,没有这个人]
相关推荐
狗头大军之江苏分军8 小时前
Python 协程进化史:从 yield 到 async/await 的底层实现
前端·后端
Ting-yu8 小时前
Spring AI Alibaba零基础速成(3) ---- ChatClient使用
java·spring·spring cloud·spring ai
升鲜宝供应链及收银系统源代码服务8 小时前
升鲜宝供应链管理系统box_周转物功能设计模块详细开发文档(一)---升鲜宝生鲜配送供应链管理系统源代码服务
java·intellij-idea·生鲜配送源代码·升鲜宝生鲜配送源代码·后端app与手机端·b2b订货商城·客户订货系统源代码
浩风祭月8 小时前
把慢查询日志扔给 AI,从分析到修复只用了半小时:一份完整的实操手册
后端·ai编程
红石程序员8 小时前
破解MyEclipse
java·ide·myeclipse
信码由缰9 小时前
Maven 4 核心亮点
java
玛卡巴卡ldf9 小时前
【LeetCode 手撕算法】(多维动态规划)不同路径、最小路径和、最长回文子串、最长公共子序列、编辑距离
java·数据结构·算法·leetcode·动态规划·力扣
春天的菠菜9 小时前
【私服】一步部署 Docker 私服
java·docker·容器
有味道的男人9 小时前
1688 跨境 API:多语言、跨境代采、独立站商品同步方案
java·服务器·前端