如何使用ControllerAdvice中的ExceptionHandler处理从控制器中的ExceptionHandler抛出的异常?
How to handle exception thrown from ExceptionHandler in controller with ExceptionHandler in ControllerAdvice?
我有自定义异常扩展异常(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 失败
"Failed to invoke @ExceptionHandler method .....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.:这里我没有加Option(3),是手动调用MyGlobalExceptionHandler
的handleAllException()
as It不是一个好习惯。相反,您应该简单地抛出异常,@ExceptionHandler
会自动处理。
手动调用的另一个问题是,在未来的某个时间点,由于您的某些流程手动调用 MyGlobalExceptionHandler
而某些流程由框架调用,因此调试异常会出现问题.
我有自定义异常扩展异常(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 失败
"Failed to invoke @ExceptionHandler method .....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.:这里我没有加Option(3),是手动调用MyGlobalExceptionHandler
的handleAllException()
as It不是一个好习惯。相反,您应该简单地抛出异常,@ExceptionHandler
会自动处理。
手动调用的另一个问题是,在未来的某个时间点,由于您的某些流程手动调用 MyGlobalExceptionHandler
而某些流程由框架调用,因此调试异常会出现问题.