0
点赞
收藏
分享

微信扫一扫

6 异常处理


1 异常的分类

1.1 可预知异常

可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。

1.2 不可预知异常

不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为RuntimeException类型(运行时异常)。

1.3 异常处理流程

  • 自定义异常类型。
  • 自定义错误代码及错误信息。
  • 对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获。
  • 对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常。

6 异常处理_错误代码

2 可预知异常处理

2.1 定义异常类

public class CustomException extends RuntimeException {

//错误代码
ResultCode resultCode;

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

}

2.2 异常抛出类

public class ExceptionCast {

public static void cast(ResultCode resultCode){
throw new CustomException(resultCode);
}
}

调用异常抛出类抛出异常

if (cmsPage1 != null) {
//抛出异常,异常是页面已经存在
ExceptionCast.cast(CmsCode.CMS_ADDPAGE_EXISTSNAME);
}

2.3 异常捕获类

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

@ControllerAdvice//控制器增强
public class ExceptionCatch {

private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);
//捕获CustomException此类异常
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResponseResult customException(CustomException customException){
//记录日志
LOGGER.error("catch exception:{}",customException.getMessage());
ResultCode resultCode = customException.getResultCode();
return new ResponseResult(resultCode);
}
}

3 不可预知异常处理

1、我们在map中配置HttpMessageNotReadableException和错误代码。
2、在异常捕获类中对Exception异常进行捕获,并从map中获取异常类型对应的错误代码,如果存在错误代码则返回此错误,否则统一返回99999错误。

@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();

//捕获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);
}
}

 

举报

相关推荐

0 条评论