SpringBoot全局異常處理註解

一、@ControllerAdvice註解

在Spring Boot開發中,開發人員通常需要在代碼中對異常進行處理。可以使用@ControllerAdvice註解定義一個類,該類中可以定義多個@ExceptionHandler註解方法來實現對全局異常的處理。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Map handleException(Exception e){
        Map map = new HashMap();
        map.put("code","500");
        map.put("message",e.getMessage());
        return map;
    }
}

使用@ControllerAdvice註解定義的異常處理類,其中使用@ExceptionHandler註解標註的方法可以捕捉到對應的異常類型並進行處理。在上面的例子中,handleException方法捕捉到了Exception類型的異常,並返回了一個Map對象,其中包含了異常的狀態碼和錯誤信息。

二、@RestControllerAdvice註解

@RestControllerAdvice註解與@ControllerAdvice註解類似,但是在返回值類型上有所不同。使用@RestControllerAdvice註解定義的異常處理類,其中使用@ExceptionHandler註解標註的方法返回值為Object類型。以下是一個使用@RestControllerAdvice註解的異常處理類的例子:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public Object handleException(Exception e){
        Map map = new HashMap();
        map.put("code","500");
        map.put("message",e.getMessage());
        return map;
    }
}

在這個例子中,handleException方法的返回值為Object類型。在方法中,定義了返回值為Map類型的變數map,序列化後返回該變數。

三、@ExceptionHandler註解

除了在@ControllerAdvice或@RestControllerAdvice註解標註的類中使用@ExceptionHandler註解處理異常外,在Controller中也可以使用該註解來處理局部異常。以下是一個Controller中使用@ExceptionHandler註解處理異常的例子:

@RestController
@RequestMapping("/demo")
public class DemoController {

    @ExceptionHandler(value = Exception.class)
    public Map handleException(Exception e){
        Map map = new HashMap();
        map.put("code","500");
        map.put("message",e.getMessage());
        return map;
    }

    @GetMapping("/{id}")
    public Map getDemoById(@PathVariable int id){
        // 模擬獲取實體對象的過程
        if(id == 1){
            throw new RuntimeException("ID不能為1");
        }
        Map map = new HashMap();
        map.put("id",id);
        map.put("name","demo");
        return map;
    }
}

在上面的例子中,當Controller的getDemoById方法執行時,如果拋出了RuntimeException異常,handleException方法就會被調用並返回一個Map對象。如果沒有拋出異常,則正常返回實體對象。

四、@ResponseStatus註解

@ResponseStatus註解可以用來定義異常的HTTP響應狀態碼和自定義的異常消息。在Spring Boot開發中,我們可以使用該註解來管理相同類型的異常,並為它們指定相同的HTTP響應狀態碼和自定義異常信息。以下是一個使用@ResponseStatus註解的例子:

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "Forbidden")
public class ForbiddenException extends RuntimeException {
}

在上面的例子中,定義了一個ForbiddenException類,並使用@ResponseStatus註解為該異常定義了返回狀態碼為403,錯誤信息為”Forbidden”。

五、結合自定義異常使用

在開發中,我們經常會使用自定義異常來處理業務中的異常情況。這個時候,結合上面介紹的註解進行全局異常處理會更加方便。以下是一個使用自定義異常和全局異常處理註解的例子:

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "Forbidden")
public class ForbiddenException extends RuntimeException {
}

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = ForbiddenException.class)
    public Map handleForbiddenException(ForbiddenException e){
        Map map = new HashMap();
        map.put("code","403");
        map.put("message",e.getMessage());
        return map;
    }

    @ExceptionHandler(value = Exception.class)
    public Map handleException(Exception e){
        Map map = new HashMap();
        map.put("code","500");
        map.put("message",e.getMessage());
        return map;
    }
}

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/{id}")
    public Map getDemoById(@PathVariable int id){
        // 模擬獲取實體對象的過程
        if(id == 1){
            throw new ForbiddenException();
        }
        Map map = new HashMap();
        map.put("id",id);
        map.put("name","demo");
        return map;
    }
}

在上面的例子中,定義了一個自定義異常ForbiddenException,並使用@ResponseStatus註解為該異常定義了返回狀態碼為403和錯誤信息為”Forbidden”。在全局異常處理註解中,分別使用@ExceptionHandler註解處理ForbiddenException和Exception兩個異常類型,並分別返回了對應的Map對象。在Controller中,如果拋出了ForbiddenException異常,handleForbiddenException方法就會被調用並返回一個Map對象,如果拋出了其他類型的異常,則調用handleException方法返回Map對象。

六、總結

在Spring Boot開發中,合理使用全局異常處理註解可以避免在代碼中出現大量的重複代碼。在定義註解時,需注意註解的使用範圍和返回值類型。結合自定義異常使用,可更好地管理代碼異常情況。

原創文章,作者:BIBJF,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/330580.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
BIBJF的頭像BIBJF
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相關推薦

發表回復

登錄後才能評論