簡體   English   中英

RestController 中的 ControllerAdvice、ExceptionHandler 和 try catch 塊

[英]ControllerAdvice, ExceptionHandler and try catch block in RestController

我有關於@ControllerAdvice@ExceptionHandler的一般性問題。 我有一個 rest controller 注釋@RestController有 2 個 api。 如果參數驗證失敗,則拋出MethodArgumentNotValidException 我創建了ExceptionHandler來處理這個:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = {MethodArgumentNotValidException.class})
    public ResponseEntity<String> handleException(MethodArgumentNotValidException e) throws Exception {
        return new ResponseEntity<>(e.getBindingResult().getGlobalError().getDefaultMessage(), HttpStatus.BAD_REQUEST);
    }
}

如果我想在發生此異常時記錄某些內容,我可以在return語句之前添加一行代碼,例如:

LOG.info("something happened");

它會記錄它然后將 BAD_REQUEST 返回給調用者嗎?

如果我想在發生此異常時記錄某些內容,我可以在 return 語句之前添加一行代碼,例如:

LOG.info("發生了什么事");

它會記錄它然后將 BAD_REQUEST 返回給調用者嗎?

是的。 這就是使用@ExceptionHandler的目的。 它們有助於減少處理項目中定義的多個 rest 端點的異常的代碼。 這也可以作為記錄異常的單點,從而避免這種反模式:

//BAD
class SomeService {
    public SomeEntity someMethod() {
        try {
            /* stuff... */
        } catch (Exception e) {
            //No need to log the exception here
            log.error("An exception happened", e);
            throw e;
        }
    }
}

盡管如此,您仍然可以獲得一些好處,例如包裝異常並重新拋出它們:

//GOOD
class SomeService {
    public SomeEntity someMethod(String param) {
        try {
            /* stuff... */
        } catch (Exception e) {
            //You may use this to perform other logic like setting specific message or wrap your exception
            log.error("Unexpected behaviour with param {}", param);
            throw new MyCustomException("Some message", e);
        }
    }
}

您可以將@ExceptionHandler視為所有 rest 端點和特定類型異常的巨大catch塊。

此外,您的GlobalExceptionHandler class 成為具有相關邏輯的組件,用於處理后端拋出的每個異常並處理如何將其報告給客戶端。

暫無
暫無

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

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