1. 程式人生 > >Springboot2:簡單的對自定義異常進行處理

Springboot2:簡單的對自定義異常進行處理

當我們需要對應不同的異常問題返回給前端不同的提示語時,我們通常會痛苦不堪,手忙腳亂。有的人甚至在裡層根據情況返回int狀態碼,再在外層使用switch進行判斷,但其實正常的思路應該是利用Spring的異常處理機制。

1.自定義異常類

1.1.定義基類

首先,假設我們在管理一個城市,現在正在搭建一個遊樂場,我們要新增一個遊樂場的資訊。他可能出現的所有錯誤都可以認為是:

@Data
public class AddAmusementParkException extends Exception {

    private String responseCode = ResponseCode.ADD_PARK_FAILURE;

    public AddAmusementParkException() {
	// 如果沒有指定響應碼,預設使用最廣的新增遊樂園失敗的響應碼。
    }

    public AddAmusementParkException(String responseCode) {
        this.responseCode = responseCode;
    }
}

1.2.定義一個子類

假如城市中已經有一個遊樂園叫“恆寶樂園”,又有一個地產商人不懷好意地申請叫“恆寶樂園”,我們應該義正言辭地拒絕,所以我們定義一個該異常類的子類:

public class AddAmusementParkNameRepeatException extends AddAmusementParkException {

    public AddAmusementParkNameRepeatException() {
        super(ResponseCode.PARK_NAME_EXIST);
    }
}

2.異常處理類

我們處理這一類異常時,可以單獨定義一個處理器,比如遊樂園異常處理器:

@Slf4j
@RestControllerAdvice
public class ParkExceptionHandle {

    @ExceptionHandler(value = AddAmusementParkException.class)
    @ResponseBody
    public DataResponse handle(AddAmusementParkException e) {
            return new I18nResponse(e.getResponseCode());
    }
}

如果你不想定義很多類,你可以通過一個來處理所有的異常:

@ControllerAdvice
public class ExceptionHandle {
 
 private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
 
 @ExceptionHandler(value = Exception.class)
 @ResponseBody
 public Result handle(Exception e) {
 if (e instanceof MyException) {
 MyException myException = (MyException) e;
 return ResultUtil.error(boyException.getCode(), boyException.getMessage());
 }else {
 logger.error("【系統異常】{}", e);
 return new Result(-1, "未知錯誤");
 }
 }
}

3.使用舉例

當我們使用了這些異常的時候,大概是下面這樣的:

    @PostMapping("/addPark")
    public DataResponse addPark(HttpServletRequest request, @RequestBody AddParkQO qo)
            throws AddAmusementParkException {
        I18nResponse response= new I18nResponse(ResponseCode.OK);
        parkService.addPark(qo);
        return response;
    }

本文參考:springboot 統一異常處理(包含統