簡體   English   中英

如何在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");
    }
}
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"

您可以為異常處理選擇以下選項之一:

選項(1) :從Controller中刪除@ExceptionHandler(MyException1.class)方法,以便MyGlobalExceptionHandler自動處理MyGlobalExceptionHandler

選項(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");
    }
}

PS:我沒有在這里添加Option(3),這是手動調用MyGlobalExceptionHandlerhandleAllException()因為這不是一個好習慣。 相反,你應該簡單地拋出異常, @ExceptionHandler會自動處理。

手動調用的另一個問題是,在將來的某個時間點,調試異常會有問題,因為一些流手動調用MyGlobalExceptionHandler並且框架會調用一些流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM