关于统一异常处理的疑惑
来源:4-3 统一异常处理的开发

mapper
2019-02-12
老师好!
关于统一异常处理这个地方我有几个问题:
-
AdException为什么要继承Exception而不是继承RuntimeException,Exception不是不支持事务回滚吗?
-
统一处理方法那个地方,老师的代码是
CommonResponse<String> response = new CommonResponse<>(-1,"business error");
那这样的话,捕捉到的AdException全都是相同的错误码-1 ,个人感觉这里用枚举会更好,在抛异常的时候传入枚举类型,然后AdException根据枚举设置code和msg,在这里捕获的时候用getCode和getMsg获取,这样对于不同的业务异常有不同的code,感觉更利于我们排查错误。
-
@ExceptionHandler(value = AdException.class) ,这里只捕获了AdException,那么如果产生了其他未知异常的时候返回给前端的结果也不友好,改为Exception.calss,然后根据instance of 判断异常类型是否属于AdException来作出相应的处理会不会更好一点。
-
handlerAdException这个方法是不是应该加上@ResponseBody注解。
1回答
-
同学你好:
第一个问题:AdException 之所以会继承 Exception,而不是 RuntimeException,是因为我想让 AdException 是一个 checked 异常。这里你说的对,Spring 默认不会回滚 Exception,所以,在使用的时候需要指定想要回滚的异常类,例如:
@Override @Transactional(rollbackFor = {AdException.class}) public AdPlanResponse updateAdPlan(AdPlanRequest request) throws AdException {
这里我确实没有在代码中写出,也是考虑会在这里提出问题。非常感谢你的回复!
第二个问题:你说的非常对,用枚举是最合适的。原因有这样的几点:
1. 错误的类型不会很多,即是可以枚举出来的;
2. 错误码和错误信息定义在枚举中,取值非常的方便;
这个可以当做扩展的内容自行添加,我并没有在课程中给出太多示例。目的是让大家自己去思考,添加适合自己当前的业务的错误码和错误信息。
第三个问题:我在课程中提到了这样做的目的。是想让大家自己去定义多种异常,比如在操作推广计划的异常:AdPlanException、操作推广单元的异常 AdUnitException等等。之后,在代码中定义不同的异常处理方法,例如:
@ExceptionHandler(value = AdPlanException.class) @ExceptionHandler(value = AdUnitException.class)
第四个问题:handlerAdException 这个方法是不需要加上 @ResponseBody 注解。如果你的 GlobalExceptionAdvice 类标注的是 @ControllerAdvice 就需要,但是,我这里标注的是 @RestControllerAdvice,可以看到其源码是个组合注解,其中就有 @ResponseBody:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @ControllerAdvice @ResponseBody public @interface RestControllerAdvice {
同学思考问题非常细致,非常认真,非常感谢你的支持与鼓励。同时也欢迎来 QQ 群随时交流、讨论!
612019-02-12
相似问题