分享一个JAVA的自动异常捕获类

具体的方法上用throws 抛出异常.
统一思想,逐层上抛,统一处理.

自定义异常类

import com.xuecheng.framework.model.response.ResultCode;

public class CustomException extends  RuntimeException{

    ResultCode resultCode;
          //ResultCode 为异常的属性 信息
    public CustomException(ResultCode resultCode){
        this.resultCode=resultCode;
    }

    public ResultCode getResultCode(){
        return this.resultCode;
    }
}

用静态方法抛出自定义异常

import com.xuecheng.framework.model.response.ResultCode;

public class ExceptionCast {

    //使用静态方法[抛出自定义异常
    public static void cast(ResultCode resultCode){
        //抛出该异常 的对象
        throw new CustomException(resultCode);
    }
}

//使用:
if (cmsPage ==null){
    ExceptionCast.cast(CmsCode.CMS_NOFIND_ERROR);
}

具体异常捕获类

import com.google.common.collect.ImmutableMap;
import com.xuecheng.framework.model.response.CommonCode;
import com.xuecheng.framework.model.response.ResponseResult;
import com.xuecheng.framework.model.response.ResultCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.event.EventRecodingLogger;
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;

/**
 * 统一异常捕获类
 */
@ControllerAdvice     //控制器增强
public class ExceptionCatch222 {
    //日志属性
    private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch222.class);
    //使用EXCEPTIONS存放异常类型和错误代码的映射,ImmutableMap的特点的一旦创建不可改变,并且线程安全
    // 改Map集合的键值对
    //  键为:Class<? extends Throwable> 一个具体的异常类
    //  值为: ResultCode 出现该异常需要显示的信息
    private static ImmutableMap<Class<? extends Throwable>, ResultCode> EXCEPTIONS;
    // 上面的整个Map需要构造器 启动   builder为改Map集合的构造启动器
    private static ImmutableMap.Builder<Class<? extends Throwable>, ResultCode> builder = ImmutableMap.builder();


    static {
        //此静态代码块的含义时,初始化Map容器时里面已经有的
        //具体的异常类 和  出现该异常需要显示的信息
        builder.put( HttpMessageNotReadableException.class,CommonCode.INVALLD_PARAM);
    }

    /**
     * 自定义异常类的自动抓取
     *
     * @param customException
     * @return
     */
    @ExceptionHandler(CustomException.class)  //该注解表示 只要出现CustomException异常 自动执行下面的方法体
    @ResponseBody   //返回值为json格式
    public ResponseResult CustomException(CustomException customException) {
        //执行到这里 表示出现异常所有记录日志
        LOGGER.error("catch exception{}", customException.getMessage());
        //通过自定义异常的静态方法 得到抛出的错误码和信息
        ResultCode resultCode = customException.getResultCode();
        //返回改错误码和信息
        return new ResponseResult(resultCode);
    }


    /**
     * 不可预知异常的自动抓取
     *
     * @param exception
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult Exception(Exception exception) {
        //代码执行到这里表示出现了 异常需要记录日志
        LOGGER.error("catch exception{}", exception.getMessage());
        //1.首先判断这个EXCEPTIONS 是否已经被构造
        if (EXCEPTIONS == null) {
            EXCEPTIONS = builder.build();
        }
        // 2. 从EXCEPTIONS容器中拿到 目前这个异常的错误代码的映射
        ResultCode resultCode = EXCEPTIONS.get(exception.getClass());
        //3.判断这个错误代码的映射 在容器中有没有 没有的话就返回通用的 错误代码映射  有的话就返回这个映射
        if (resultCode == null) {
            return new ResponseResult(CommonCode.SERVER_ERROR);
        } else {
            return new ResponseResult(resultCode);
        }
    }
}

怎么用???

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值