SpringBoot自定义异常并全局捕获
- 前言 :不会写Bug的程序员不是一个好程序员, 不出异常的程序不是好程序,我们要做的就是抓住它,然后接着写Bug
处理流程
-
创建自定义异常类
/** * 基础异常 */ public class BaseException extends RuntimeException { private static final long serialVersionUID = 1L; /** * 所属模块 */ private String module; /** * 错误码 */ private String code; /** * 错误码对应的参数 */ private Object[] args; /** * 错误消息 */ private String defaultMessage; public BaseException(String module, String code, Object[] args, String defaultMessage) { this.module = module; this.code = code; this.args = args; this.defaultMessage = defaultMessage; } public BaseException(String module, String code, Object[] args) { this(module, code, args, null); } public BaseException(String module, String defaultMessage) { this(module, null, null, defaultMessage); } public BaseException(String code, Object[] args) { this(null, code, args, null); } public BaseException(String defaultMessage) { this(null, null, null, defaultMessage); } public String getModule() { return module; } public String getCode() { return code; } public Object[] getArgs() { return args; } public String getDefaultMessage() { return defaultMessage; } }
-
创建具体模块的异常类
/** * 用户信息异常类 */ public class FileException extends BaseException { private static final long serialVersionUID = 1L; public UserException(String code, Object[] args) { super("file", code, args, null); } }
-
对异常类型再做细分
/** * 文件名称超长限制异常类 */ public class FileNameLengthLimitExceededException extends FileException { private static final long serialVersionUID = 1L; public FileNameLengthLimitExceededException(int defaultFileNameLength) { super("upload.filename.exceed.length", new Object[]{defaultFileNameLength}); } }
-
使用SpringBoot提供的异常处理(AOP技术)
/** * 全局异常处理器 */ @RestControllerAdvice public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 基础异常 */ @ExceptionHandler(BaseException.class) public Result baseException(BaseException e) { return Result.error(e.getDefaultMessage()); } // 以下是自定义注解捕获异常的逻辑 /** * 自定义验证异常 */ @ExceptionHandler(BindException.class) public Result validatedBindException(BindException e) { log.error(e.getMessage(), e); String message = e.getAllErrors().get(0).getDefaultMessage(); return Result.error(message); } /** * 自定义验证异常 */ @ExceptionHandler(MethodArgumentNotValidException.class) public Result validExceptionHandler(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); String message = e.getBindingResult().getFieldError().getDefaultMessage(); return Result.error(message); } }
总结一下
- 自定义异常类,一般继承RuntimeException
- 进行模块划分
- 全局异常捕获