关于统一异常处理的疑惑

来源:4-3 统一异常处理的开发

mapper

2019-02-12

老师好!
关于统一异常处理这个地方我有几个问题:

  1. AdException为什么要继承Exception而不是继承RuntimeException,Exception不是不支持事务回滚吗?

  2. 统一处理方法那个地方,老师的代码是

 CommonResponse<String> response = new CommonResponse<>(-1,"business error");

那这样的话,捕捉到的AdException全都是相同的错误码-1 ,个人感觉这里用枚举会更好,在抛异常的时候传入枚举类型,然后AdException根据枚举设置code和msg,在这里捕获的时候用getCode和getMsg获取,这样对于不同的业务异常有不同的code,感觉更利于我们排查错误。

  1. @ExceptionHandler(value = AdException.class) ,这里只捕获了AdException,那么如果产生了其他未知异常的时候返回给前端的结果也不友好,改为Exception.calss,然后根据instance of 判断异常类型是否属于AdException来作出相应的处理会不会更好一点。

  2. handlerAdException这个方法是不是应该加上@ResponseBody注解。

写回答

1回答

张勤一

2019-02-12

同学你好:

    第一个问题: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 群随时交流、讨论!

6
1
mapper
非常感谢!
2019-02-12
共1条回复

Spring Cloud微服务架构 设计实现广告系统

广告营销系统,未来大中型企业的标配

2136 学习 · 927 问题

查看课程