目錄1 定義錯誤碼類2 定義業務異常類3 全局異常處理器4 使用5 前端請求效果總結 1 定義錯誤碼類 可以定義各種錯誤碼枚舉,比如業務,系統相關的報錯信息 /** * 錯誤代碼 * 錯誤碼 * * @author leovany * @date 2023/09/23 */ public enu ...
目錄
1 定義錯誤碼類
可以定義各種錯誤碼枚舉,比如業務,系統相關的報錯信息
/**
* 錯誤代碼
* 錯誤碼
*
* @author leovany
* @date 2023/09/23
*/
public enum ErrorCode {
SUCCESS(0, "success", ""),
ERROR_PARAMS(40000, "請求參數錯誤", ""),
ERROR_NULL(40001, "請求數據為空", ""),
ERROR_LOGIN(40100, "未登錄", ""),
ERROR_NO_AUTH(41001, "無許可權", ""),
ERROR_SYSTEM(50000, "系統內部異常", "")
;
/**
* 錯誤碼ID
*/
private final int code;
/**
* 錯誤碼信息
*/
private final String message;
/**
* 錯誤碼描述(詳情)
*/
private final String description;
ErrorCode(int code, String message, String description) {
this.code = code;
this.message = message;
this.description = description;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
public String getDescription() {
return description;
}
}
2 定義業務異常類
-
相對於 java 的異常類,支持更多欄位
擴展了
code
和description
兩個欄位 -
自定義構造函數,更靈活 / 快捷的設置欄位
import com.leovany.usercenter.common.ErrorCode;
/**
* 業務異常
* 自定義業務異常類
*
* @author leovany
* @date 2023/09/23
*/
public class BusinessException extends RuntimeException {
/**
* 錯誤碼
*/
private final int code;
/**
* 描述
*/
private final String description;
/**
* 業務異常
*
* @param message 信息
* @param code 錯誤碼
* @param description 描述
*/
public BusinessException(String message, int code, String description) {
super(message);
this.code = code;
this.description = description;
}
/**
* 業務異常
*
* @param errorCode 錯誤代碼
*/
public BusinessException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
this.description = errorCode.getDescription();
}
/**
* 業務異常
*
* @param errorCode 錯誤代碼
* @param description 描述
*/
public BusinessException(ErrorCode errorCode, String description) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
}
3 全局異常處理器
-
通過Spring AOP實現,在調用方法前後進行額外的處理
-
作用
- 捕獲代碼中所有的異常,讓前端得到更詳細的業務報錯信息
- 屏蔽掉項目框架本身的異常,不暴露伺服器的內部狀態
- 集中處理,比如還可以做記錄日誌
import com.leovany.usercenter.common.ResultVO;
import com.leovany.usercenter.common.ErrorCode;
import com.leovany.usercenter.common.ResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 全局異常處理類
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 處理異常-BusinessException
* @param e
* @return
*/
@ExceptionHandler(BusinessException.class)
public ResultVO<?> businessExceptionHandler(BusinessException e){
log.error("businessException:" + e.getMessage(),e);
return ResultUtils.error(e.getCode(),e.getMessage(),e.getDescription());
}
/**
* 處理異常-RuntimeException
* @param e
* @return
*/
@ExceptionHandler(RuntimeException.class)
public ResultVO<?> runtimeExceptionHandler(RuntimeException e){
log.error("runtimeException:" + e);
return ResultUtils.error(ErrorCode.ERROR_SYSTEM,e.getMessage());
}
}
4 使用
throw new BusinessException
可以在方法中,任意地方拋出,很方便
- 示例代碼
@PostMapping("/login")
public ResultVO<User> userLogin(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request) {
String userAccount = userLoginRequest.getUserAccount();
String userPassword = userLoginRequest.getUserPassword();
if (StringUtils.isAnyBlank(userAccount, userPassword)) {
throw new BusinessException(ErrorCode.ERROR_PARAMS);
}
User user = userService.doLogin(userAccount, userPassword, request);
return ResultUtils.success(user);
}
- 代碼對比
5 前端請求效果
總結
通過封裝全局異常處理,對異常信息做了統一處理,讓前端得到更詳細的業務信息,同時保證系統的安全性(不會暴露系統內部信息),在代碼上對參數校驗等方面提供更加方便的形式。
本文由博客一文多發平臺 OpenWrite 發佈!