CMS页面管理
在统一异常处理类中去捕获异常,无需controller捕获异常,向用户返回统一规范的响应信息.一般为json格式
- 异常处理流程
- 自定义异常类型。
- 自定义错误代码及错误信息。
- 对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获。
- 可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较
齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。
- 可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较
- 对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常
- 不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为
RuntimeException类型(运行时异常)。
- 不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为
- 可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示,最终也会随
请求响应给客户端。
- 异常抛出及处理流程:
- 在controller、service、dao中程序员抛出自定义异常;springMVC框架抛出框架异常类型
- 统一由异常捕获类捕获异常,并进行处理
- 捕获到自定义异常则直接取出错误代码及错误信息,响应给用户
- 捕获到非自定义异常类型首先从Map中找该异常类型是否对应具体的错误代码,如果有则取出错误代码和错误
信息并响应给用户,如果从Map中找不到异常类型所对应的错误代码则统一为99999错误代码并响应给用户。 - 将错误代码及错误信息以Json格式响应给用户
- 自定义一个异常类.然后继承RuntimeException,因为这样对我们的代码没有侵入性.不需要对异常进行声明或者捕获.
- 写一个异常抛出类.
-
/** *自定义的异常类 */ public class CustomException extends RuntimeException { //错误代码 ResultCode resultCode; public CustomException(ResultCode resultCode){ this.resultCode = resultCode; } public ResultCode getResultCode(){ return resultCode; } } /** * 定义返回结果集 */ public interface ResultCode { //操作是否成功,true为成功,false操作失败 boolean success(); //操作代码 int code(); //提示信息 String message(); }
异常捕获类:
-
使用 @ControllerAdvice和@ExceptionHandler注解来捕获指定类型的异常
-
/** * 统一异常捕获类 */ @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(); //捕获CustomException此类异常 @ExceptionHandler(CustomException.class) @ResponseBody public ResponseResult customException(CustomException customException){ //记录日志 LOGGER.error("catch exception:{}",customException.getMessage()); ResultCode resultCode = customException.getResultCode(); return new ResponseResult(resultCode); } //捕获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); } }
- 定义错误代码
-
@ToString public enum CommonCode implements ResultCode{ INVALID_PARAM(false,10003,"非法参数!"), SUCCESS(true,10000,"操作成功!"), FAIL(false,11111,"操作失败!"), UNAUTHENTICATED(false,10001,"此操作需要登陆系统!"), UNAUTHORISE(false,10002,"权限不足,无权操作!"), SERVER_ERROR(false,99999,"抱歉,系统繁忙,请稍后重试!"); // private static ImmutableMap<Integer, CommonCode> codes ; //操作是否成功 boolean success; //操作代码 int code; //提示信息 String message; private CommonCode(boolean success,int code, String message){ this.success = success; this.code = code; this.message = message; } @Override public boolean success() { return success; } @Override public int code() { return code; } @Override public String message() { return message; } }
- 在springboot添加扫描注解
-
@ComponentScan(basePackages="你的包名")//扫描common工程下的类
这样以后有异常的话直接就可以ExceptionCast.cast(错误代码)
-
不添加扫描的话,异常只会在控制台出现,当初请求结果返回
-
-
-
-