欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-20 18:46:28
...

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);
    }

}

相关标签: 自定义异常类