springboot公共统一异常处理(可预知异常和不可预知异常)

mac2025-10-13  9

1.编写公共类 ResultCode

/** * Created by test on 2019/11/1. * 10000-- 通用错误代码 * 20000-- 文件系统 */ public interface ResultCode { //操作是否成功,true为成功,false操作失败 boolean success(); //操作代码 int code(); //提示信息 String message(); }

2.编写公共类 CommonCode

import lombok.ToString; @ToString public enum CommonCode implements ResultCode{ INVALID_PARAM(false,10003,"非法参数!"), SUCCESS(true,10000,"操作成功!"), FAIL(false,11111,"操作失败!"), UNAUTHENTICATED(false,10001,"此操作需要登陆系统!"), UNAUTHORISE(false,10002,"权限不足,无权操作!"), SERVER_ERROR(false,99999,"抱歉,系统繁忙,请稍后重试!"); // private static ImmutableMap<Integer, CommonCode> codes ; //操作是否成功 boolean success; //操作代码 int code; //提示信息 String message; private CommonCode(boolean success,int code, String message){ this.success = success; this.code = code; this.message = message; } @Override public boolean success() { return success; } @Override public int code() { return code; } @Override public String message() { return message; } }

3.编写公共类 ResponseResult 

import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Data @ToString @NoArgsConstructor public class ResponseResult implements Response { //操作是否成功 boolean success = SUCCESS; //操作代码 int code = SUCCESS_CODE; //提示信息 String message; public ResponseResult(ResultCode resultCode){ this.success = resultCode.success(); this.code = resultCode.code(); this.message = resultCode.message(); } public static ResponseResult SUCCESS(){ return new ResponseResult(CommonCode.SUCCESS); } public static ResponseResult FAIL(){ return new ResponseResult(CommonCode.FAIL); } }

 

4.创建自定义异常类,,继承RuntimeException(好处:不用抛出和捕获异常)

/** * 自定义异常类型 * @author Administrator * @version 1.0 * @create 2019-11-1 **/ public class CommonException extends RuntimeException { //错误代码 ResultCode resultCode; public CommonException (ResultCode resultCode){ this.resultCode = resultCode; } public ResultCode getResultCode(){ return resultCode; } }

5.编写统一异常抛出类 ExceptionCast

public class ExceptionCast { public static void cast(ResultCode resultCode){ throw new CommonException (resultCode); } }

6.编写统一异常捕获类 ExceptionCatch (重点)

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableMap; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * 统一异常捕获类 * @author Administrator * @version 1.0 * @create 2018-09-14 17:32 **/ @ControllerAdvice//控制器增强 public class ExceptionCatch { private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class); //定义map,配置异常类型所对应的错误代码 private static ImmutableMap<Class<? extends Throwable>,ResultCode> EXCEPTIONS; //定义map的builder对象,去构建ImmutableMap protected static ImmutableMap.Builder<Class<? extends Throwable>,ResultCode> builder = ImmutableMap.builder(); //捕获CustomException此类异常 @ExceptionHandler(CustomException.class) @ResponseBody public ResponseResult commonException(CommonException commonException){ //记录日志 LOGGER.error("catch exception:{}",commonException.getMessage()); ResultCode resultCode = commonException.getResultCode(); return new ResponseResult(resultCode); } //捕获Exception此类异常 @ExceptionHandler(Exception.class) @ResponseBody public ResponseResult exception(Exception exception){ //记录日志 LOGGER.error("catch exception:{}",exception.getMessage()); if(EXCEPTIONS == null){ EXCEPTIONS = builder.build();//EXCEPTIONS构建成功 } //从EXCEPTIONS中找异常类型所对应的错误代码,如果找到了将错误代码响应给用户,如果找不到给用户响应99999异常 ResultCode resultCode = EXCEPTIONS.get(exception.getClass()); if(resultCode !=null){ return new ResponseResult(resultCode); }else{ //返回99999异常 return new ResponseResult(CommonCode.SERVER_ERROR); } } static { //定义异常类型所对应的错误代码 builder.put(HttpMessageNotReadableException.class,CommonCode.INVALID_PARAM); } }

7.使用在需要抛出异常的地方写 

ExceptionCast.cast(CommonCode.SERVER_ERROR);

 

最新回复(0)