异常处理流程
异常处理统一处理流程
- 自定义异常类型
- 自定义错误代码及错误信息
- 对可预知异常由程序员在代码中主动抛出,由SpringMVC统一捕获
- 对不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常
- 可预知的异常及不可预知的运行时异常最终采用统一的消息格式响应给客户端。
- 异常抛出及处理流程:
- 在controller、service、dao中程序员抛出自定义异常;SpringMVC框架抛出框架异常类型
- 统一由异常捕获类捕获异常,并进行处理
- 捕获到自定义异常则直接取出错误代码及错误信息,响应给用户
- 、捕获到非自定义异常类型首先从Map中找该异常类型是否对应具体的错误代码,如果有则取出错误代码和错误信息并响应给用户,如果从Map中找不到异常类型所对应的错误代码则统一为99999错误代码并响应给用户。
- 将错误代码及错误信息以Json格式响应给用户。
可预知异常处理
自定义异常类
public class CustomException extends RuntimeException {
private ResultCode resultCode;
public CustomException(ResultCode resultCode) {
//异常信息为错误代码+异常信息
super("错误代码:"+resultCode.code()+"错误信息:"+resultCode.message());
this.resultCode = resultCode;
}
public ResultCode getResultCode(){
return this.resultCode;
}
}
异常抛出类
public class ExceptionCast {
//使用此静态方法抛出自定义异常
public static void cast(ResultCode resultCode){
throw new CustomException(resultCode);
}
}
异常捕获类
使用== @ControllerAdvice和@ExceptionHandler==注解来捕获指定类型的异常
@ControllerAdvice
public class ExceptionCatch {
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);
//捕获 CustomException异常
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResponseResult customException(CustomException e) {
LOGGER.error("catch exception : {}\r\nexception: ",e.getMessage(), e);
ResultCode resultCode = e.getResultCode();
ResponseResult responseResult = new ResponseResult(resultCode);
return responseResult;
}
}
public class CustomException extends RuntimeException {
//错误代码
ResultCode resultCode;
public CustomException(ResultCode resultCode){
this.resultCode = resultCode;
}
public ResultCode getResultCode(){
return resultCode;
}
}
不可预知异常处理
定义异常捕获方法
- 异常抛出
- 异常捕获