springboot下添加全局异常处理和自定义异常处理的过程解析
前言
在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。
相关代码:
GlobalExceptionHandler类:
@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { /******************************** * @function : 自定义从捕捉 * @parameter : [e:CustomException | 自定义异常] * @date : 2023/12/5 11:47 ********************************/ @ExceptionHandler(value = CustomException.class) public AjaxResult customExceptionHandler(HttpServletRequest request, CustomException e) { log.error("业务异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e); return new AjaxResult(e.getCode() , e.getMessage(), null); } /******************************** * @function : 空指针异常捕捉 * @parameter : [e:Exception | 异常] * @date : 2023/12/5 11:47 ********************************/ @ExceptionHandler(value = Exception.class) public AjaxResult exceptionHandler(HttpServletRequest request, Exception e) { log.error("服务器内部异常异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e); return new AjaxResult(500 , e.getMessage(), null); } }
自定义异常CustomException类:
@Slf4j @Data public class CustomException extends RuntimeException{ //错误码 private int code; //错误信息 private String message; public CustomException() { super(); } public CustomException(ResultCodeEnum resultCodeEnum) { super(String.valueOf(resultCodeEnum.getCode())); this.code = resultCodeEnum.getCode(); this.message = resultCodeEnum.getMessage(); } }
通用返回类:AjaxResult
@Data public class AjaxResult extends HashMap<String, Object> { // 状态码 private static final String CODE_TAG = "code"; // 返回消息 private static final String MSG_TAG = "message"; // 数据对象 private static final String DATA_TAG = "data"; public AjaxResult(int code, String message, Object data) { super.put(CODE_TAG, code); super.put(MSG_TAG, message); if (data != null) { super.put(DATA_TAG, data); } } /******************************** * @method : success * @function : 返回成功消息(重载) * @parameter : * @return : AjaxResult ********************************/ public static AjaxResult success(){ return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), null); } /******************************** * @method : success * @function : 返回成功消息(重载) * @parameter : message : String | 返回消息 * @return : AjaxResult ********************************/ public static AjaxResult success(String message){ return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, null); } /******************************** * @method : success * @function : 返回成功消息(重载) * @parameter : data : Object | 数据对象 * @return : AjaxResult ********************************/ public static AjaxResult success(Object data){ return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data); } /******************************** * @method : success * @function : 返回成功消息(重载) * @parameter : message : String | 返回消息 * @parameter : data : Object | 数据对象 * @return : AjaxResult ********************************/ public static AjaxResult success(String message, Object data){ return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, data); } /******************************** * @method : failed * @function : 返回失败消息(重载) * @parameter : * @return : AjaxResult ********************************/ public static AjaxResult failed(){ return new AjaxResult(ResultCodeEnum.FAILED.getCode(), ResultCodeEnum.FAILED.getMessage(), null); } /******************************** * @method : failed * @function : 返回失败消息(重载) * @parameter : message : String | 返回消息 * @return : AjaxResult ********************************/ public static AjaxResult failed(String message){ return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, null); } /******************************** * @method : failed * @function : 返回失败消息(重载) * @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型 * @return : AjaxResult ********************************/ public static AjaxResult failed(ResultCodeEnum resultCodeEnum){ return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null); } /******************************** * @method : failed * @function : 返回失败消息(重载) * @parameter : message : String | 返回消息 * @parameter : data : Object | 数据对象 * @return : AjaxResult ********************************/ public static AjaxResult failed(String message, Object data){ return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, data); } /******************************** * @method : failed * @function : 返回失败消息(重载) * @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型 * @parameter : data : Object | 数据对象 * @return : AjaxResult ********************************/ public static AjaxResult failed(ResultCodeEnum resultCodeEnum, Object data){ return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data); } }
枚举类ResultCodeEnum:
public enum ResultCodeEnum { // 10??? 通用 SUCCESS(10000,"请求成功"), FAILED(10008, "请求失败"), FAILED_PARAM_ERROR(10009, "参数错误"), ... private Integer code; private String message; ResultCodeEnum(Integer code, String message) { this.code = code; this.message = message; } public int getCode(){ return code; } public String getMessage(){ return message; } }
使用:
在controller里面判断值是否异常,如果异常则直接抛出异常不进行执行,终止当前的流程,在service层也可以这样处理。
public AjaxResult getUserInfo(@RequestParam(value = "userId") Integer userId) { if (userId == 0) { throw new CustomException(ResultCodeEnum.NOT_EXIST_USER_ERROR); } ... }
再者是一些数值上的错误,比如除0,这种情况会被全局异常捕获,并返回相应的错误给到前端
@GetMapping("/test") public AjaxResult test(){ int i = 60/0; return AjaxResult.success(); }
到此这篇关于springboot下添加全局异常处理和自定义异常处理的文章就介绍到这了,更多相关springboot异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java abstract class interface之间的区别介绍
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象,abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法2012-11-11解决springSecurity 使用默认登陆界面登录后无法跳转问题
这篇文章主要介绍了解决springSecurity 使用默认登陆界面登录后无法跳转问题,项目环境springboot下使用springSecurity 版本2.7.8,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧2023-12-12Java中使用Hutool的DsFactory操作多数据源的实现
在Java开发中,管理多个数据源是一项常见需求,Hutool作为一个全能的Java工具类库,提供了DsFactory工具,帮助开发者便捷地操作多数据源,感兴趣的可以了解一下2024-09-09SpringBoot集成Redisson实现延迟队列的场景分析
这篇文章主要介绍了SpringBoot集成Redisson实现延迟队列,本文通过场景分析实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-04-04
最新评论