Java 自定义运行时异常抓取用法笔记

1
自定义异常类,(作用:将来你抓取的异常抛出的具体类)

public class CustomException extends RuntimeException {
    //错误代码,用来返回异常信息
    ResultCode resultCode;
	//构造函数
    public CustomException(ResultCode resultCode){
        this.resultCode = resultCode;
    }
	
    public ResultCode getResultCode() {
        return resultCode;
    }
}

ResultCode接口信息(异常具体信息的接口)

public interface ResultCode {
    //操作是否成功,true为成功,false操作失败
    boolean success();
    //操作代码
    int code();
    //提示信息
    String message();

}

异常抛出方法类(这个类不是必须的,只是方便调用,不用每次throw new )

public class ExceptionCast {
	//负责抛异常的方法,抛出自定义异常类
    public static void cast(ResultCode resultCode){
        //利用构造方法创建自定义异常类
        throw new CustomException(resultCode);
    }
}

异常抓取类
负责抓取你抛出的自定义异常

import com.google.common.collect.ImmutableMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
//这个注解控制器通知注解(可以理解为控制器增强)和 @ExceptionHandler一起使用达到捕获一个指定异常并执行一个方法
@ControllerAdvice
//加这个注解的原因是返回前端的数据需要转成json数据,可以被前端获取
@ResponseBody
public class ExceptionCatch {
    //记录日志
    private  static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);
    //定义一个map,配置位置异常类型所对应的错误代码,这个map定义时,需要定义一个map的builder(用来构建immutableMap),Immutable对象:不能被更改的集合通常用于固定的配置
    private static ImmutableMap<Class<? extends Throwable>,ResultCode> EXCEPTIONS;
    //定义map的builder
    protected static ImmutableMap.Builder<Class<? extends Throwable>,ResultCode> builder = ImmutableMap.builder();
    //自定义异常处理类
    //异常处理器注解,捕获到异常后 执行被注解的方法(value值是目标异常类,只有当value值的异常才会执行注解标注的方法)
    @ExceptionHandler(CustomException.class)
    //ResponseResult 类是自定义的结果返回信息类(所有往前端response的信息规范类)
    public ResponseResult customException (CustomException customException){
        //记录日志
        LOGGER.error("catch exception:{}",customException.getMessage());
        ResultCode resultCode = customException.getResultCode();
        return  new ResponseResult(resultCode);
    }
    //未知异常处理信息(除了你自定义的异常外的所有异常,这里利用ImmutableMap存储未知异常中你可以预判的异常,也就是框架一些常见的异常,比如HttpMessageNotReadableException这个异常,提前存到map集合中,一旦触发此类异常显示给用户固定的错误代码,服务器忙之类的)
    @ExceptionHandler(Exception.class)
    public ResponseResult exception(Exception exception){
       //记录日志
       LOGGER.error("catch exception:{}",exception.getMessage());
       if (EXCEPTIONS == null){
           EXCEPTIONS = builder.build();
       }
        ResultCode resultCode = EXCEPTIONS.get(exception.getClass());
       if (resultCode==null){
           return new ResponseResult(CommonCode.SERVER_ERROR);
       }else {
           return new ResponseResult(resultCode);
       }
    }
    //保证可预见的未知异常存储的map在第一时间加载
    static {
        builder.put(HttpMessageNotReadableException.class,CommonCode.INVALID_PARAM);
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值