全局异常处理
原创,请勿转载!!!!!
要是实现了,帮忙点个赞!!!!!
目录
1、使用技术;
2、jar包依赖;
3、准备;
4、实现效果。
1、使用技术;
springboot + mysql + @RestControllerAdvice
@RestControllerAdvice解析:
@RestControllerAdvice的特点:
通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置。
注解了@RestControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
@RestControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。
@ExceptionHandler:用于指定异常处理方法。当与@RestControllerAdvice配合使用时,用于全局处理控制器里的异常。
@InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
@ModelAttribute:本来作用是绑定键值对到Model中,当与@ControllerAdvice配合使用时,可以让全局的@RequestMapping都能获得在此处设置的键值对
————————————————
原文链接:https://blog.csdn.net/user2025/article/details/105458842
2、jar包依赖;
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
3、准备;
3.1GlobalExceptionHandler
/**
* 全局异常处理器
*/
@RestControllerAdvice
@Slf4j
@Component
public class GlobalExceptionHandler {
@Resource
private ExceptionService exceptionService;
/**
* 处理自定义异常
*/
@ExceptionHandler(value = DiyException.class)
public Response bizExceptionHandler(DiyException e) {
log.error(e.getMessage(), e);
exceptionService.addException(ExceptionEntity.builder()
.exceptionMessage(e.getMessage())
.exceptionType(ErrorEnum.SELF_EXCEPTION.getErrorMsg())
.build());
return Response.defineError(e);
}
/**
* 处理Exception异常
*/
@ExceptionHandler(value = Exception.class)
public Response exceptionHandler(Exception e) {
StringBuffer stringBuffer = new StringBuffer("错误信息: [" + e.getMessage());
int number = 0;
for (StackTraceElement element : e.getStackTrace()) {
if (element.getClassName().contains(ErrorEnum.CONTROLLER.getErrorMsg())
|| element.getClassName().contains(ErrorEnum.SERVICE.getErrorMsg())
|| element.getClassName().contains(ErrorEnum.MAPPER.getErrorMsg())) {
stringBuffer.append("] 序号:[" + ++number + "] " +
"文件:[" + element.getFileName() + "] " +
"方法:[" + element.getMethodName() + "] " +
"代码行:[" + element.getLineNumber() + "] ");
}
}
exceptionService.addException(ExceptionEntity.builder()
.exceptionMessage(stringBuffer.toString())
.exceptionType(ErrorEnum.SYSTEM_EXCEPTION.getErrorMsg())
.build());
log.info("异常信息:{}", stringBuffer.toString());
return Response.otherError(ErrorEnum.INTERNAL_SERVER_ERROR);
}
}
3.2 ExceptionService
public interface ExceptionService {
public Integer addException(ExceptionEntity exceptionEntity);
void makeException();
}
3.3 ExceptionServiceImpl
@Service
public class ExceptionServiceImpl implements ExceptionService {
@Resource
private ExceptionMapper exceptionMapper;
@Override
public Integer addException(ExceptionEntity exceptionEntity) {
return exceptionMapper.insert(exceptionEntity);
}
@Override
public void makeException() {
int i=0;
System.out.println(10/i);
}
}
3.4DiyException
/**
* @author yinxing
* @date 2022-09-09
*/
public class DiyException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 错误状态码
*/
protected Integer errorCode;
/**
* 错误提示
*/
protected String errorMsg;
public DiyException(){
}
public DiyException(Integer errorCode, String errorMsg) {
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public Integer getErrorCode() {
return errorCode;
}
public void setErrorCode(Integer errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
4、实现效果。
@RequestMapping("/test")
public Response test(String message) {
int i=0;
System.out.println(10/i);
return Response.success(ErrorEnum.SUCCESS.getErrorMsg(),null);
}