java封装全局异常处理深入详解
作者:Leovany
这篇文章主要为大家介绍了java封装全局异常处理的深入详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
1 定义错误码类
可以定义各种错误码枚举,比如业务,系统相关的报错信息
/** * 错误代码 * 错误码 * * @author leovany * @date 2023/09/23 */ public enum ErrorCode { SUCCESS(0, "success", ""), ERROR_PARAMS(40000, "请求参数错误", ""), ERROR_NULL(40001, "请求数据为空", ""), ERROR_LOGIN(40100, "未登录", ""), ERROR_NO_AUTH(41001, "无权限", ""), ERROR_SYSTEM(50000, "系统内部异常", "") ; /** * 错误码ID */ private final int code; /** * 错误码信息 */ private final String message; /** * 错误码描述(详情) */ private final String description; ErrorCode(int code, String message, String description) { this.code = code; this.message = message; this.description = description; } public int getCode() { return code; } public String getMessage() { return message; } public String getDescription() { return description; } }
2 定义业务异常类
相对于 java 的异常类,支持更多字段
扩展了
code
和description
两个字段- 自定义构造函数,更灵活 / 快捷的设置字段
import com.leovany.usercenter.common.ErrorCode; /** * 业务异常 * 自定义业务异常类 * * @author leovany * @date 2023/09/23 */ public class BusinessException extends RuntimeException { /** * 错误码 */ private final int code; /** * 描述 */ private final String description; /** * 业务异常 * * @param message 信息 * @param code 错误码 * @param description 描述 */ public BusinessException(String message, int code, String description) { super(message); this.code = code; this.description = description; } /** * 业务异常 * * @param errorCode 错误代码 */ public BusinessException(ErrorCode errorCode) { super(errorCode.getMessage()); this.code = errorCode.getCode(); this.description = errorCode.getDescription(); } /** * 业务异常 * * @param errorCode 错误代码 * @param description 描述 */ public BusinessException(ErrorCode errorCode, String description) { super(errorCode.getMessage()); this.code = errorCode.getCode(); this.description = description; } public int getCode() { return code; } public String getDescription() { return description; } }
3 全局异常处理器
通过Spring AOP实现,在调用方法前后进行额外的处理
作用
- 捕获代码中所有的异常,让前端得到更详细的业务报错信息
- 屏蔽掉项目框架本身的异常,不暴露服务器的内部状态
- 集中处理,比如还可以做记录日志
import com.leovany.usercenter.common.ResultVO; import com.leovany.usercenter.common.ErrorCode; import com.leovany.usercenter.common.ResultUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 全局异常处理类 */ @RestControllerAdvice @Slf4j public class GlobalExceptionHandler { /** * 处理异常-BusinessException * @param e * @return */ @ExceptionHandler(BusinessException.class) public ResultVO<?> businessExceptionHandler(BusinessException e){ log.error("businessException:" + e.getMessage(),e); return ResultUtils.error(e.getCode(),e.getMessage(),e.getDescription()); } /** * 处理异常-RuntimeException * @param e * @return */ @ExceptionHandler(RuntimeException.class) public ResultVO<?> runtimeExceptionHandler(RuntimeException e){ log.error("runtimeException:" + e); return ResultUtils.error(ErrorCode.ERROR_SYSTEM,e.getMessage()); } }
4 使用
throw new BusinessException
可以在方法中,任意地方抛出,很方便
- 示例代码
@PostMapping("/login") public ResultVO<User> userLogin(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request) { String userAccount = userLoginRequest.getUserAccount(); String userPassword = userLoginRequest.getUserPassword(); if (StringUtils.isAnyBlank(userAccount, userPassword)) { throw new BusinessException(ErrorCode.ERROR_PARAMS); } User user = userService.doLogin(userAccount, userPassword, request); return ResultUtils.success(user); }
- 代码对比
5 前端请求效果
总结
通过封装全局异常处理,对异常信息做了统一处理,让前端得到更详细的业务信息,同时保证系统的安全性(不会暴露系统内部信息),在代码上对参数校验等方面提供更加方便的形式。
以上就是java封装全局异常处理深入详解的详细内容,更多关于java封装全局异常处理的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:
- 基于java.lang.IllegalArgumentException异常报错问题及解决
- IDEA 中使用 ECJ 编译出现 java.lang.IllegalArgumentException的错误问题
- 如何解决Mybatis--java.lang.IllegalArgumentException: Result Maps collection already contains value for X
- java捕获AOP级别的异常并将其传递到Controller层
- Java 8中Collectors.toMap空指针异常源码解析
- java.lang.IllegalArgumentException:Invalid character found异常解决