异常抛出与处理流程
- 自定义异常类型;
- 自定义错误代码及错误信息;
- 对于可预知异常(自定义异常)主动抛出,由SpringMVC统一捕获;
- 对于不可预知异常(运行时异常)由SpringMVC统一捕获Exception类型的异常;
- 最终所有异常采用统一信息格式(错误代码+错误信息)随请求响应给客户端。
可预知异常
自定义异常类型
@AllArgsConstructor
@Getter
public class CustomException extends RuntimeException {
ResultCode resultCode;
}
响应格式
public interface ResultCode {
//操作是否成功,true为成功,false操作失败
boolean success();
//操作代码
int code();
//提示信息
String message();
}
响应结果类
@Data
@ToString
@NoArgsConstructor
public class ResponseResult implements Response {
//操作是否成功
boolean success = SUCCESS;
//操作代码
int code = SUCCESS_CODE;
//提示信息
String message;
public ResponseResult(ResultCode resultCode){
this.success = resultCode.success();
this.code = resultCode.code();
this.message = resultCode.message();
}
}
public interface Response {
public static final boolean SUCCESS = true;
public static final int SUCCESS_CODE = 10000;
}
public class ExceptionCast {
public static void cast(ResultCode resultCode) {
throw new CustomException(resultCode);
}
}
具体的异常内容定义在枚举类中
统一异常捕获类
@RestControllerAdvice
@Slf4j
public class ExceptionCatch {
@ExceptionHandler(CustomException.class)
public ResponseResult customException(CustomException customException) {
log.error("catch exception: {}", customException.getMessage());
ResultCode resultCode = customException.getResultCode();
return new ResponseResult(resultCode);
}
}
可由前端接收到异常信息,回显至页面。
不可预知异常
在原本的统一异常捕获类中增加:
@RestControllerAdvice
@Slf4j
public class ExceptionCatch {
// 定义map
private static ImmutableMap<Class<? extends Throwable>, ResultCode> EXCEPTIONS;
protected static ImmutableMap.Builder<Class<? extends Throwable>, ResultCode> builder = ImmutableMap.builder();
// 定义异常类型所对应的错误信息
static {
builder.put(HttpMessageNotReadableException.class, CommonCode.INVALID_PARAM);
}
@ExceptionHandler(CustomException.class)
public ResponseResult customException(CustomException customException) {
log.error("catch exception: {}", customException.getMessage());
ResultCode resultCode = customException.getResultCode();
return new ResponseResult(resultCode);
}
@ExceptionHandler(Exception.class)
public ResponseResult exception(Exception exception) {
log.error("catch exception: {}", exception.getMessage());
if (EXCEPTIONS == null) {
EXCEPTIONS = builder.build(); // 构建map
}
// 从map中查询错误信息
ResultCode resultCode = EXCEPTIONS.get(exception.getClass());
if (resultCode != null) {
return new ResponseResult(resultCode);
} else {
return new ResponseResult(CommonCode.SERVER_ERROR);
}
}
}