我有自定义异常扩展异常(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
来自控制器建议MyException2
控制器本身的处理程序内部MyException3
来自控制器建议MyException2
和 MyException3
按预期工作,但 MyException1
失败并显示:
无法调用@ExceptionHandler方法.....handleMyException1
您可以选择以下选项之一进行异常处理:
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
,而某些流程由框架调用。