1.自定义异常
java
@Getter
public class ServiceImplException extends RuntimeException {
private ResultCode resultCode;
public ServiceImplException(ResultCode resultCode) {
this.resultCode = resultCode;
}
}
ResultCode是一个枚举类,用来枚举出现的状态码和异常信息。
java
@AllArgsConstructor
@Getter
public enum ResultCode {
/** 定义状态码 */
//操作成功
SUCCESS (1000, "操作成功"),
//服务器内部错误,友好提示
ERROR (2000, "服务繁忙请稍后重试")
}
2.定义全局异常处理
实现代码:
java
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler<T> {
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public Result<?>
handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
HttpServletRequest request)
{
String requestURI = request.getRequestURI();
log.error("请求地址'{}',不⽀持'{}'请求", requestURI, e.getMethod());
return Result.failed(ResultCode.FAILED_USER_NOT_EXISTS);
}
/**
* 拦截运⾏时异常
*/
@ExceptionHandler(RuntimeException.class)
public Result<?> handleRuntimeException(RuntimeException e, HttpServletRequest
request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发⽣异常.", requestURI, e);
return Result.failed(ResultCode.ERROR);
}
/**
* 捕获service层的异常
* @param e
* @param request
* @return
*/
@ExceptionHandler(ServiceImplException.class)
public Result<?> ServiceImplException(ServiceImplException e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
ResultCode resultCode = e.getResultCode();
log.error("请求地址'{}',发生业务异常.", requestURI, resultCode.getMsg(),e);
return Result.failed(resultCode);
}
/**
* 系统异常
*/
@ExceptionHandler(Exception.class)
public Result<?> handleException(Exception e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发⽣异常.", requestURI, e);
return Result.failed (ResultCode. ERROR );
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<?> handleBindException(Exception e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发⽣异常.", requestURI, e);
return Result.failed (ResultCode.ERROR_FORMAT );
}
}
注意两点:
一是需要在类上@RestControllerAdvice加上注解。
二是需要在相应的方法上加上@ExceptionHandler注解,后面跟上处理相应的异常。
最终达到的效果就是我们在服务层抛出相应的异常之后,这里会自动捕捉抛出的异常,但是抛出的异常必须是这里实现相应的逻辑的异常。