java自定义异常

CMS页面管理

   在统一异常处理类中去捕获异常,无需controller捕获异常,向用户返回统一规范的响应信息.一般为json格式

  •   异常处理流程
    1. 自定义异常类型。
    2. 自定义错误代码及错误信息。
    3. 对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获。 
      1. 可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较
        齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。
    4. 对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常
      1. 不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为
        RuntimeException类型(运行时异常)。
    5. 可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示,最终也会随
      请求响应给客户端。
  • 异常抛出及处理流程:
  1. 在controller、service、dao中程序员抛出自定义异常;springMVC框架抛出框架异常类型
  2. 统一由异常捕获类捕获异常,并进行处理
  3. 捕获到自定义异常则直接取出错误代码及错误信息,响应给用户
  4. 捕获到非自定义异常类型首先从Map中找该异常类型是否对应具体的错误代码,如果有则取出错误代码和错误
    信息并响应给用户,如果从Map中找不到异常类型所对应的错误代码则统一为99999错误代码并响应给用户。
  5. 将错误代码及错误信息以Json格式响应给用户

 

  • 自定义一个异常类.然后继承RuntimeException,因为这样对我们的代码没有侵入性.不需要对异常进行声明或者捕获.
  • 写一个异常抛出类.
    • /**
       *自定义的异常类
       */
      public class CustomException extends RuntimeException {
      
          //错误代码
          ResultCode resultCode;
      
          public CustomException(ResultCode resultCode){
              this.resultCode = resultCode;
          }
          public ResultCode getResultCode(){
              return resultCode;
          }
      
      
      }
      
      
      /**
       * 定义返回结果集
       */
      public interface ResultCode {
          //操作是否成功,true为成功,false操作失败
          boolean success();
          //操作代码
          int code();
          //提示信息
          String message();
      
      }

      异常捕获类:

      • 使用 @ControllerAdvice和@ExceptionHandler注解来捕获指定类型的异常

      • /**
         * 统一异常捕获类
         */
        @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 customException(CustomException customException){
                //记录日志
                LOGGER.error("catch exception:{}",customException.getMessage());
                ResultCode resultCode = customException.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);
            }
        }

         

      • 定义错误代码
        • @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;
              }
          
          
          }

           

        •   在springboot添加扫描注解
          • @ComponentScan(basePackages="你的包名")//扫描common工程下的类

            这样以后有异常的话直接就可以ExceptionCast.cast(错误代码)

          • 不添加扫描的话,异常只会在控制台出现,当初请求结果返回

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值