现象:
监听全局异常,自定义异常抛出
方法:
全局异常处理:@RestControllerAdvice 监听全局异常
统一异常处理:@ExceptionHandler(Exception.class):用在方法上面表示遇到这个异常就执行以下方法。
1:设置全局异常监听类、设置方法来设置监听异常类型
2:监听全局异常 自定义提示语句返回、适合放到类最后处理!
自定义异常:
1:自定义异常类型类:
2:在程序中抛出自定义异常类
3:全局监听自定义异常处理
代码:
1-自定义异常
//package com.yh.common.exception;
//
///**
// * 版本号异常
// */
//public class VersionChangeException extends RuntimeException {
//
// private Integer code;
//
// public VersionChangeException(Integer code) {
// super("数据已被更改,请刷新页面!");
// this.code = code;
// }
//
// public Integer getCode() {
// return code;
// }
//}
项目多种异常监听 记录下
package com.yh.common.exception;
import com.yh.common.util.JsonUtil;
import feign.FeignException;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.StaleObjectStateException;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestControllerAdvice
@Slf4j
public class RestExceptionHandler {
@ExceptionHandler(ServiceException.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResult serviceExceptionHandler(ServiceException e) {
log.error("controller advice rest exception:", e);
ErrorResult ertn = new ErrorResult(e.getCode(), e.getMessage()) ;
return ertn;
}
@ExceptionHandler({MethodArgumentNotValidException.class, BindException.class})
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResult validatorExceptionHandler(Exception exception) {
log.error("controller advice rest exception:", exception);
BindingResult bindResult = null;
if (exception instanceof BindException) {
bindResult = ((BindException) exception).getBindingResult();
} else if (exception instanceof MethodArgumentNotValidException) {
bindResult = ((MethodArgumentNotValidException) exception).getBindingResult();
}
String msg = "";
List<FieldError> fieldErrors=bindResult.getFieldErrors();
for (FieldError error:fieldErrors){
msg += error.getDefaultMessage()+";";
log.error(error.getField()+":"+error.getDefaultMessage());
}
if(msg.length()>0){
msg= msg.substring(0,msg.length()-1);
}
ErrorResult ertn = new ErrorResult(ErrorCodeEnum.ERRPR_INPUT.getCode(), msg) ;
return ertn;
}
@ExceptionHandler({FeignException.class})
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResult feignExceptionHandler(FeignException e){
String msg = e.contentUTF8();
log.error(msg);
ErrorResult ertn = JsonUtil.toObject(msg, ErrorResult.class) ;
return ertn;
}
@ExceptionHandler(value = HttpReqException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResult httpReqExceptionHandler(HttpReqException e){
log.error("controller advice rest exception:", e);
return new ErrorResult(e.getCode(), e.getMessage()) ;
}
@ExceptionHandler(value = StaleObjectStateException.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResult VersionChangeExceptionHandler(StaleObjectStateException e){
log.error("controller advice rest exception:", e);
return new ErrorResult(ErrorCodeEnum.VERSION_ERROR);
}
@ExceptionHandler(Exception.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResult ExceptionHandler(Exception e) {
log.error("controller advice rest exception:", e);
ErrorResult ertn = new ErrorResult(ErrorCodeEnum.SYSTEM_ERROR) ;
return ertn;
}
}