1. 两种异常处理机制
1.1 使用 throw 关键字手动抛出异常
使用
throw关键字
抛出异常,代码会的显得简单明了
如下图所示
1.2 使用 try-catch 捕获异常
使用
try-catch
进行捕获异常,往往会使代码变得更加笼统,层层包裹
如下图所示
2. 自定义异常处理
我们可以使用我们自定义的异常处理,用于解决我们所设定的异常
import lombok.Data;
/**
* 自定义异常
*/
@Data
public class XueChengPlusException extends RuntimeException{
private String errMessage;
public XueChengPlusException() {
}
public XueChengPlusException(String message) {
this.errMessage = message;
}
public static void cast(String message){
throw new XueChengPlusException(message);
}
public static void cast(CommonError error){
throw new XueChengPlusException(error.getErrMessage());
}
}
3. 异常返回前端信息model
由于我们往往需要前后端联调的时候,寻要获取异常处理的信息,使其显示在前端页面,显示给用户
import java.io.Serializable;
/**
* 错误响应参数包装,异常信息模型
*/
public class RestErrorResponse implements Serializable {
private final String errMessage;
public RestErrorResponse(String errMessage) {
this.errMessage = errMessage;
}
public String getErrMessage() {
return errMessage;
}
}
4. 通用异常信息
从上文来看,我们自定义异常继承的是RuntimeException,但如果是出现其他类型的异常,例如Exception…,我们需要定义一个通用异常处理
/**
* @description 通用错误信息
*/
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;
}
}
5. 全局异常处理
这是一个异常处理机器,用于处理各种异常,然后返回给前端一个异常信息
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
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;
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 针对自定义异常进行处理
* @param e
* @return
*/
@ExceptionHandler(XueChengPlusException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public RestErrorResponse customException(XueChengPlusException e){
//记录异常
log.error("系统异常{}",e.getErrMessage(),e);
//解析出异常信息
String errMessage = e.getErrMessage();
RestErrorResponse restErrorResponse = new RestErrorResponse(errMessage);
return restErrorResponse;
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public RestErrorResponse customException(Exception e){
//记录异常
log.error("系统异常{}",e.getMessage(),e);
//解析出异常信息
RestErrorResponse restErrorResponse = new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());
return restErrorResponse;
}
}