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