如何使用ControllerAdvice中的ExceptionHandler处理控制器中的ExceptionHandler抛出的异常?

问题描述 投票:0回答:1

我有自定义异常扩展异常(MyException1,MyException2,MyException3)

@Controller
public class MyController {
    /*
       Method throwing MyException1
       Method throwing MyException2
       Method throwing MyException3
    */

    @ExceptionHandler(MyException1.class)
    public void handleMyException1(Exception ex){
        //Do something
        throw ex;
    }
    @ExceptionHandler(MyException2.class)
    public void handleMyException2(Exception ex){
        System.out.println("Exception Logged inside Controller")
    }
}

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public void handleAllException(Exception ex){
        System.out.println("Exception logged Outside Controller");
    }
}

我的意图:

  • 记录
    MyException1
    来自控制器建议
  • log
    MyException2
    控制器本身的处理程序内部
  • 记录
    MyException3
    来自控制器建议

MyException2
MyException3
按预期工作,但
MyException1
失败并显示:

无法调用@ExceptionHandler方法.....handleMyException1

java spring spring-mvc exception spring-aop
1个回答
1
投票

您可以选择以下选项之一进行异常处理:

Option(1) : 从 Controller 中删除

@ExceptionHandler(MyException1.class)
方法,以便
MyGlobalExceptionHandler
自动处理它。

Option(2):创建

MyException4
(这是带有添加信息的
MyException1
的包装器)并将其从控制器中抛出,如下所示:

@Controller
public class MyController {
    /*
       Method throwing MyException1
       Method throwing MyException2
       Method throwing MyException3
    */

    @ExceptionHandler(MyException1.class)
    public void handleMyException1(Exception ex){
         //MyException4 exe4 = new MyException4();
        // Add the required details to it
        throw exe4;
    }

    @ExceptionHandler(MyException2.class)
    public void handleMyException2(Exception ex){
        System.out.println("Exception Logged inside Controller")
    }
}

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public void handleAllException(Exception ex){
        System.out.println("Exception logged Outside Controller");
    }
}

P.S.:我没有在这里添加选项(3),它手动调用

MyGlobalExceptionHandler
handleAllException()
,因为这不是一个好的做法。相反,您应该简单地抛出异常,然后
@ExceptionHandler
会自动处理。

手动调用的另一个问题是,在将来的某个时间点,调试异常将会出现问题,因为某些流程手动调用

MyGlobalExceptionHandler
,而某些流程由框架调用。

© www.soinside.com 2019 - 2024. All rights reserved.