如何正確利用ExceptionHandler註解進行錯誤處理

異常處理是很常見的一個程序設計需求,無論是在處理本地還是遠程的異常都需要謹慎處理。在 Java 編程語言中,異常是非常重要的一部分,合理的使用異常處理能夠提高代碼的可讀性和可維護性。使用 Java 異常機制可以讓代碼更加優雅,在遇到異常的情況下使程序更加健壯。而 ExceptionHandler 註解則是用於在 Spring 應用程序中處理異常的一種方式。接下來,本文將通過多個方面來講解如何正確利用 ExceptionHandler 註解來進行錯誤處理。

一、 合理地拋出異常

合理地拋出異常是一個程序員應該掌握的基本技能。在 Java 編程語言中,我們通常是使用 try-catch 塊來處理異常。在編寫代碼時,應該遵循這樣的原則:只有應該被捕獲的異常才會被捕獲。此外,異常應儘可能地清晰明了地描述問題。在拋出異常時,應該將異常對象和相關信息一同傳遞。

以下是一個示例程序代碼,用來展示合理地拋出異常所涉及的要點。

public class Demo {
    public void save(String name, String password) throws UserException {
        // 名稱為空 或 密碼為空時,應該拋出異常
        if (StringUtils.isBlank(name) || StringUtils.isBlank(password)) {
            throw new UserException("用戶名或密碼不能為空");
        }
        // 其他操作
    }
}

在代碼中,StringUtils.isBlank() 方法用來判斷傳入的字符串是否為空,如果為空,則該異常就會被拋出。如果有多個異常需要處理,可以把異常信息打包成不同的異常並在 API 中聲明。

二、使用@ControllerAdvice和@ExceptionHandler註解

Spring 框架提供了一個更好的方式,使用 @ControllerAdvice 和 @ExceptionHandler 註解。使用這些註解,可以將異常處理結構和原代碼分離,同時保留異常處理器的彈性。具體來說, @ControllerAdvice 是一個帶有 @ExceptionHandler 註解的 Spring Bean,它可以處理基於控制器的異常。

以下是一個示例代碼,用來展示如何正確使用 @ControllerAdvice 和 @ExceptionHandler 註解。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(HttpServletRequest request, Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("exception", e);
        mv.addObject("url", request.getRequestURL());
        mv.setViewName("error/error");
        return mv;
    }
}

在使用過程中,我們需要在定義中指定我們要處理的異常。這裡我們處理 Exception 類的異常。在方法中,我們使用 ModelAndView 對象來封裝異常信息,並指定要返回的頁面。在這個例子中,我們將異常信息和請求 URL 一起交給 view page 渲染。

三、處理特定的異常

Spring 還允許我們在 @ExceptionHandler 註解中指定異常類型,以處理特定的異常。如果你不指定異常類型,則默認捕獲所有異常。

以下是一個實例代碼,用來展示如何處理特定的異常。

@ControllerAdvice
public class CustomExceptionHandler {
    @ExceptionHandler(DataAccessException.class)
    public ModelAndView handleDataAccessException(HttpServletRequest request, Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("exception", e);
        mv.addObject("url", request.getRequestURL());
        mv.addObject("message", "數據訪問異常");
        mv.setViewName("error/error");
        return mv;
    }
}

在這個實例代碼中,我們定義了一個專門的異常處理器來處理 DataAccessException 異常。在方法中,除了設置 View 和封裝原始異常信息外,我們還增加了一個 message 參數,這個參數可以包含關於異常類型的有用信息,以便後續調試。通過這種方式,我們可以更加細緻地處理特定的異常情況。

四、降低日誌級別

在異常處理時,錯誤信息在控制台或日誌中的重要性可能會因為過於頻繁而被低估。異常日誌需要很好地處理,其中之一便是通過適當的日誌級別來降低日誌信息的量。

以下是一段示例代碼,用來降低日誌級別。

@ControllerAdvice
public class CustomExceptionHandler {
    private static final logger LOGGER = LoggerFactory.getLogger(String.class.getName());
    @ExceptionHandler(DataAccessException.class)
    public ModelAndView handleDataAccessException(HttpServletRequest request, Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("exception", e);
        mv.addObject("url", request.getRequestURL());
        mv.addObject("message", "數據訪問異常");
        mv.setViewName("error/error");
        LOGGER.info("error", e); // 使用 info 級別
        return mv;
    }
}

在這個代碼中,我們降低了日誌級別,使用 INFO 級別讓錯誤信息並不會在控制台或日誌中被打印過多次數,避免過度引起注意,同時保留錯誤信息的必要性。

總結

本文通過多個方面介紹了如何正確利用 ExceptionHandler 註解進行錯誤處理,包括合理地拋出異常、使用 @ControllerAdvice 和 @ExceptionHandler 註解、處理特定的異常、以及降低日誌級別。這些技術將會使以後的異常處理更加優雅,也更有可讀性和可維護性。

參考鏈接:https://www.baeldung.com/exception-handling-for-rest-with-spring

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/304494.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-01 11:05
下一篇 2025-01-01 11:05

相關推薦

發表回復

登錄後才能評論