springboot创建自定义异常类,使用统一异常类处理异常信息
1.目的
处理异常信息,相较于在方法内抛出抛出异常,使用全局异常处理类捕获异常信息更方便管理。
2.异常类
2.1. 自定义异常类 XueChengPlusException.java
package com.xuecheng.exception;
import lombok.Data;
/**
* 自定义异常类
*/
public class XueChengPlusException extends RuntimeException{
private String errMessage;
public XueChengPlusException() {
super();
}
public XueChengPlusException(String message) {
super(message);
this.errMessage = message;
}
public String getErrMessage() {
return errMessage;
}
public void setErrMessage(String errMessage) {
this.errMessage = errMessage;
}
public static void cast(String message){
throw new XueChengPlusException(message);
}
public static void cast(CommonError error){
throw new XueChengPlusException(error.getErrMessage());
}
}
2.2.通用错误信息类 CommonError.java
package com.xuecheng.exception;
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.3.和前端约定返回的异常信息类 RestErrorResponse.java
package com.xuecheng.exception;
import java.io.Serializable;
/**
* 和前端约定返回的异常信息
*/
public class RestErrorResponse implements Serializable {
private String errMessage;
public RestErrorResponse() {
}
public String getErrMessage() {
return errMessage;
}
public void setErrMessage(String errMessage) {
this.errMessage = errMessage;
}
public RestErrorResponse(String errMessage) {
this.errMessage = errMessage;
}
}
2.4.全局异常信息处理类 GlobalExceptionHandle.java
package com.xuecheng.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
/**
* 全局异常信息处理类
*/
@Slf4j
//@ControllerAdvice
@RestControllerAdvice //相当于@ControllerAdvice和 @RequestBody
public class GlobalExceptionHandle {
//对项目的自定义异常类型进行处理
// @ResponseBody
@ExceptionHandler(XueChengPlusException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse customException(XueChengPlusException e){
//记录异常日志
log.error("系统异常:{}",e.getErrMessage(),e);
//解析出异常信息
String message = e.getErrMessage();
RestErrorResponse restErrorResponse = new RestErrorResponse(message);
return restErrorResponse;
}
// @ResponseBody
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse Exception(Exception e){
//记录异常日志
log.error("系统异常:{}",e.getMessage(),e);
//解析出异常信息
RestErrorResponse restErrorResponse = new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());
return restErrorResponse;
}
}
3.业务类抛出异常
当走到 XueChengPlusException.cast("出错了");时,会进入全局自定义异常类customException方法
当走到int i = 5/0;时,会进入全局自定义异常类Exception方法
public CourseBaseInfoDto createCourseBase(Long companyId,AddCourseDto dto) {
if (true){
// int i = 5/0;
XueChengPlusException.cast("出错了");
}
}