请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于统一异常处理的疑惑

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

  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 23:05:09

同学你好:

    第一个问题:AdException 之所以会继承 Exception,而不是 RuntimeException,是因为我想让 AdException 是一个 checked 异常。这里你说的对,Spring 默认不会回滚 Exception,所以,在使用的时候需要指定想要回滚的异常类,例如:

1
2
3
4
@Override
@Transactional(rollbackFor = {AdException.class})
public AdPlanResponse updateAdPlan(AdPlanRequest request) 
        throws AdException {

    这里我确实没有在代码中写出,也是考虑会在这里提出问题。非常感谢你的回复!


    第二个问题:你说的非常对,用枚举是最合适的。原因有这样的几点:

        1. 错误的类型不会很多,即是可以枚举出来的;

        2. 错误码和错误信息定义在枚举中,取值非常的方便;

    这个可以当做扩展的内容自行添加,我并没有在课程中给出太多示例。目的是让大家自己去思考,添加适合自己当前的业务的错误码和错误信息。


    第三个问题:我在课程中提到了这样做的目的。是想让大家自己去定义多种异常,比如在操作推广计划的异常:AdPlanException、操作推广单元的异常 AdUnitException等等。之后,在代码中定义不同的异常处理方法,例如:

1
2
@ExceptionHandler(value = AdPlanException.class)
@ExceptionHandler(value = AdUnitException.class)


    第四个问题:handlerAdException 这个方法是不需要加上 @ResponseBody 注解。如果你的 GlobalExceptionAdvice 类标注的是 @ControllerAdvice 就需要,但是,我这里标注的是 @RestControllerAdvice,可以看到其源码是个组合注解,其中就有 @ResponseBody:

1
2
3
4
5
6
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {


    同学思考问题非常细致,非常认真,非常感谢你的支持与鼓励。同时也欢迎来 QQ 群随时交流、讨论!

6 回复 有任何疑惑可以回复我~
  • 提问者 mapper #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-02-12 23:46:25
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号