spring统一异常处理 蔚落 2024-03-27 11:15 29阅读 0赞 如果是spring cloud 项目则需要在base模块中添加相应的统一异常处理,如果是单体项目则在config文件夹下添加统一异常处理. 添加的主要方式是基于注解开发的异常处理办法: 1.@ExceptionHandler spring提供的标注异常类处理方法的注解,用在方法上或者类上,用来表明方法处理的异常的类型.(后面的括号中主要添加要处理的异常类,可以是自定义的也可以是java自带的) 2.@ControllerAdvice Spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强, 在项目中来增强 SpringMVC中的Controller。通常和 @ExceptionHandler 结合使用,来处理SpringMVC的异常 信息。 3.@ResponseStatus Spring3.0提供的标识在方法上或类上的注解,用状态代码和应返回的原因标记方法或异常类。 调用处理程序方法时,状态代码将应用于HTTP响应。 1.定义一些通用的异常信息 package com.xuecheng.base.exception; /** * @description 通用错误信息 * @author Mr.M * @date 2022/9/6 11:29 * @version 1.0 */ public enum CommonError { UNKOWN_ERROR("执行过程异常,请重试。"), PARAMS_ERROR("非法参数"), OBJECT_NULL("对象为空"), QUERY_NULL("查询结果为空"), REQUEST_NULL("请求参数为空"); private String errMessage; public String getErrMessage() { return errMessage; } private CommonError( String errMessage) { this.errMessage = errMessage; } } 2.自定义异常类型:(用于清晰的说明有预期的异常的处理) package com.xuecheng.base.exception; /** * @author YCL * @version 1.0 * @description TODO * @date 2023-01-31 17:50 */ public class XueChengPlusException extends RuntimeException{ private String errMsg; public XueChengPlusException() { super(); } public XueChengPlusException(String message) { super(message); this.errMsg = message; } public String getErrMsg() { return errMsg; } public static void cast(CommonError commonError){ throw new XueChengPlusException(commonError.getErrMessage()); } public static void cast(String message){ throw new XueChengPlusException(message); } } 3.响应用户的统一类型 package com.xuecheng.base.exception; import java.io.Serializable; /** * 错误响应参数包装 */ public class RestErrorResponse implements Serializable { private String errMessage; public RestErrorResponse(String errMessage){ this.errMessage= errMessage; } public String getErrMessage() { return errMessage; } public void setErrMessage(String errMessage) { this.errMessage = errMessage; } } 4.全局异常拦截 package com.xuecheng.base.exception; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; /** * @author YCL * @version 1.0 * @description TODO * @date 2023-01-31 20:56 */ @Slf4j @ControllerAdvice public class GlobalExceptionHandler { @ResponseBody @ExceptionHandler(XueChengPlusException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public RestErrorResponse customException(XueChengPlusException e){ log.error("系统异常 {}",e.getErrMsg(),e); return new RestErrorResponse(e.getErrMsg()); } @ResponseBody @ExceptionHandler(Exception.class) //来表明方法的处理异常类型。 @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//用状态代码和应返回的原因标记方法或异常类 public RestErrorResponse exception(Exception e){ log.error("系统异常 {}",e.getMessage(),e); return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage()); } } #### 一些问题: #### 系统处理异常的方法: 自定义一个异常处理器去处理并捕获异常,使用控制器增强器@ControllerAdvice和异常处理注解@ExceptionHandler来处理 1)处理自定义异常: 程序在编写的时候根据校验结果自动的抛出自定义的异常类(主动行为),比如收费课程的价格设置为0,这种可预期的错误.异常处理器捕获异常并返回日志给相应用户. 2)处理未知异常: 在执行接口的过程中一些运行时异常也会由程序捕获,一路异常日志,统一相应给用户500错误,这样能更加友好,在异常处理的过程中还可以针对某个异常类型单独处理
还没有评论,来说两句吧...