在Spring框架中,特別是使用Spring MVC或Spring Boot時,可以採用以下幾種方式來擷取和處理框架自動丟擲的異常,使其更加符合應用的需求和提升使用者體驗:
1. 全域性異常處理器 - @ControllerAdvice
使用@ControllerAdvice
註解定義一個全域性異常處理類,可以捕獲整個應用程式中控制器丟擲的異常。
示例程式碼:
Java
1import org.springframework.http.ResponseEntity;
2import org.springframework.web.bind.annotation.ControllerAdvice;
3import org.springframework.web.bind.annotation.ExceptionHandler;
4import org.springframework.web.client.HttpClientErrorException;
5
6@ControllerAdvice
7public class GlobalExceptionHandler {
8
9 @ExceptionHandler(value = {HttpClientErrorException.class})
10 public ResponseEntity<String> handleHttpClientErrorException(HttpClientErrorException e) {
11 // 處理特定異常,例如HttpClientErrorException
12 return ResponseEntity.status(e.getStatusCode()).body("發生錯誤:" + e.getMessage());
13 }
14
15 @ExceptionHandler(value = {Exception.class})
16 public ResponseEntity<String> handleGeneralException(Exception e) {
17 // 處理其他未被捕獲的異常
18 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("伺服器內部錯誤:" + e.getMessage());
19 }
20}
2. 實現 HandlerExceptionResolver
實現HandlerExceptionResolver
介面,可以對所有控制器方法丟擲的異常進行處理。
示例程式碼:
Java
1import org.springframework.web.servlet.HandlerExceptionResolver;
2import org.springframework.web.servlet.ModelAndView;
3
4public class CustomExceptionResolver implements HandlerExceptionResolver {
5
6 @Override
7 public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
8 // 根據異常型別自定義處理邏輯
9 if (ex instanceof NullPointerException) {
10 // 處理NullPointerException
11 } else if (ex instanceof IllegalArgumentException) {
12 // 處理IllegalArgumentException
13 } else {
14 // 預設處理邏輯
15 }
16 // 返回ModelAndView以控制檢視和模型資料
17 }
18}
別忘了將自定義的異常解析器新增到Spring的配置中。
3. 使用AOP(面向切面程式設計)
透過AOP可以攔截方法呼叫,捕獲並處理異常。
示例程式碼:
Java
1import org.aspectj.lang.annotation.Aspect;
2import org.aspectj.lang.annotation.AfterThrowing;
3import org.springframework.stereotype.Component;
4
5@Aspect
6@Component
7public class ExceptionHandlingAspect {
8
9 @AfterThrowing(pointcut = "execution(* com.yourpackage.controller.*.*(..))", throwing = "ex")
10 public void handleControllerExceptions(Exception ex) {
11 // 在這裡處理控制器丟擲的異常
12 }
13}
4. 在具體Controller中使用@ExceptionHandler
直接在控制器類中使用@ExceptionHandler
註解,處理該控制器內丟擲的特定異常。
示例程式碼:
Java
1@RestController
2public class MyController {
3
4 @ExceptionHandler(value = ResourceNotFoundException.class)
5 public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
6 return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
7 }
8
9 // ...其他方法
10}
透過這些方式,你可以有效地擷取並定製Spring框架自動丟擲的異常處理邏輯,提供更友好的錯誤反饋和提升應用的健壯性。