java - 如何使用ControllerAdvice中的ExceptionHandler处理从 Controller 中的ExceptionHandler抛出的异常?

标签 java spring spring-mvc exception-handling spring-aop

我有自定义异常扩展异常(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");
    }
}
My Intention: To log MyException1 from controller advice
              To log MyException2 inside handler in controller itself
              To log MyException3 from controller advice
MyException2 and MyException3 are working as intended but MyException1 fails with 
"Failed to invoke @ExceptionHandler method .....handleMyException1"

最佳答案

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

Option(1):从 Controller 中删除 @ExceptionHandler(MyException1.class) 方法,以便 MyGlobalExceptionHandler 自动处理它。

Option(2) :创建 MyException4(它是 MyException1 的包装器,添加了信息)并从 Controller 中抛出它,如下所示:

@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.: 我没有在这里添加 Option(3),这是手动调用 MyGlobalExceptionHandlerhandleAllException() 因为它不是一个好习惯。相反,您应该简单地抛出异常,@ExceptionHandler 将自动处理。

手动调用的另一个问题是,在将来的某个时间点,由于您的一些流程手动调用 MyGlobalExceptionHandler 而一些流程由框架。

关于java - 如何使用ControllerAdvice中的ExceptionHandler处理从 Controller 中的ExceptionHandler抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40485391/

相关文章:

java - Servlet 信息未在 WebSphere 上获取完整版本

java - 我正在尝试使用具有多行的扫描仪,并尝试使用另一个字符串 java 更改输入

java - 如何在 Spring MVC 异常处理程序中访问 @PathVariable?

java - Spring Integration DSL - 等待来自流中 channel 的输入

Java 最佳实践静态最终映射值

java - getParams() 和 JsonArrayRequest

Spring事务——检测回滚和提交

java - 无法将类型 'java.lang.String' 的值转换为所需类型 'java.lang.Integer' 在 jpa spring 中

java - 使用 Spring MVC 在 jar 文件中显示 jsp 页面

java - 在 spring Controller 中处理多个 @PathVariable 属性