擷取Spring框架自動丟擲異常

jason47發表於2024-05-15

在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框架自動丟擲的異常處理邏輯,提供更友好的錯誤反饋和提升應用的健壯性。

相關文章