異常處理是很常見的一個程序設計需求,無論是在處理本地還是遠程的異常都需要謹慎處理。在 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