1.全局捕獲異常:進(jìn)行全局捕獲異痴铗龋可以去捕獲一些運(yùn)行時(shí)候的錯(cuò)誤磺平,將這些錯(cuò)誤信息處理掉,而不去返回給用戶沃但。
2.代碼如下:
1.自定義已給枚舉類磁滚,做統(tǒng)一管理
/**
* 功能描述:自定義一個(gè)枚舉類,進(jìn)行錯(cuò)誤碼的統(tǒng)一管理
*/
public enum ResultEnum {
SUCCESS(0, "成功"),
FAILURE(1, "失敗"),
/* 參數(shù)錯(cuò)誤:10001-19999 */
PARAM_IS_INVALID(10001, "參數(shù)無效"),
PARAM_IS_BLANK(10002, "參數(shù)為空"),
PARAM_TYPE_BIND_ERROR(10003, "參數(shù)類型錯(cuò)誤"),
PARAM_NOT_COMPLETE(10004, "參數(shù)缺失"),
/* 用戶錯(cuò)誤:20001-29999*/
USER_NOT_LOGGED_IN(20001, "用戶未登錄"),
USER_LOGIN_ERROR(20002, "賬號(hào)不存在或密碼錯(cuò)誤"),
USER_ACCOUNT_FORBIDDEN(20003, "賬號(hào)已被禁用"),
USER_NOT_EXIST(20004, "用戶不存在"),
USER_HAS_EXISTED(20005, "用戶已存在"),
/* 業(yè)務(wù)錯(cuò)誤:30001-39999 */
SPECIFIED_QUESTIONED_USER_NOT_EXIST(30001, "某業(yè)務(wù)出現(xiàn)問題"),
/* 系統(tǒng)錯(cuò)誤:40001-49999 */
SYSTEM_INNER_ERROR(40001, "系統(tǒng)繁忙,請(qǐng)稍后重試"),
/* 數(shù)據(jù)錯(cuò)誤:50001-599999 */
RESULE_DATA_NONE(50001, "數(shù)據(jù)未找到"),
DATA_IS_WRONG(50002, "數(shù)據(jù)有誤"),
DATA_ALREADY_EXISTED(50003, "數(shù)據(jù)已存在"),
/* 接口錯(cuò)誤:60001-69999 */
INTERFACE_INNER_INVOKE_ERROR(60001, "內(nèi)部系統(tǒng)接口調(diào)用異常"),
INTERFACE_OUTTER_INVOKE_ERROR(60002, "外部系統(tǒng)接口調(diào)用異常"),
INTERFACE_FORBID_VISIT(60003, "該接口禁止訪問"),
INTERFACE_ADDRESS_INVALID(60004, "接口地址無效"),
INTERFACE_REQUEST_TIMEOUT(60005, "接口請(qǐng)求超時(shí)"),
INTERFACE_EXCEED_LOAD(60006, "接口負(fù)載過高"),
/* 權(quán)限錯(cuò)誤:70001-79999 */
PERMISSION_NO_ACCESS(70001, "無訪問權(quán)限");
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer code() {
return this.code;
}
public String message() {
return this.msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
2.所需調(diào)取返回的工具類(也可用泛型進(jìn)行封裝修改)
/**
* http請(qǐng)求返回的最外層對(duì)象
*/
public class Result {
/**
* 錯(cuò)誤碼.
*/
private Integer code;
/**
* 提示信息.
*/
private String msg;
/**
* 具體的內(nèi)容.
*/
private Object data;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public void setResultCode(ResultEnum code) {
this.code = code.code();
this.msg = code.message();
}
//成功 不返回?cái)?shù)據(jù)直接返回成功信息
public static Result success() {
Result result = new Result();
result.setResultCode(ResultEnum.SUCCESS);
return result;
}
//成功 并且加上返回?cái)?shù)據(jù)
public static Result success(Object data) {
Result result = new Result();
result.setResultCode(ResultEnum.SUCCESS);
result.setData(data);
return result;
}
//成功 自定義成功返回狀態(tài) 加上數(shù)據(jù)
public static Result success(ResultEnum resultEnum, Object data) {
Result result = new Result();
result.setResultCode(resultEnum);
result.setData(data);
return result;
}
// 單返回失敗的狀態(tài)碼
public static Result failure(ResultEnum resultEnum) {
Result result = new Result();
result.setResultCode(resultEnum);
return result;
}
// 返回失敗的狀態(tài)碼 及 數(shù)據(jù)
public static Result failure(ResultEnum resultEnum, Object data) {
Result result = new Result();
result.setResultCode(resultEnum);
result.setData(data);
return result;
}
//進(jìn)行自定義異常消息 覆蓋原始定義消息
public static Result error(Integer code, String msg) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
3.自定義全局異常處理
/**
* 功能描述:自定義全局異常處理
* 之所以繼承RuntimeException因?yàn)槠湓赟pring中會(huì)進(jìn)行事務(wù)回滾 而其父類不會(huì)
*/
public class CustomizeException extends RuntimeException {
private Integer code;
public CustomizeException(ResultEnum resultEnum) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode();
}
//新增msg 進(jìn)行自定義異常消息
public CustomizeException(ResultEnum resultEnum, String msg) {
super(msg);
this.code = resultEnum.getCode();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
4.全局異常捕獲:
import com.itcast.exception.CustomizeException;
import com.itcast.util.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
/**
* 功能描述:捕獲異常類
*/
@ControllerAdvice
@Slf4j
public class ExceptionHandle {
//攔截的錯(cuò)誤
@ExceptionHandler(value = Exception.class)
//一些異常是因?yàn)檎?qǐng)求邏輯導(dǎo)致宵晚,而非服務(wù)器本身內(nèi)部處理異常垂攘,這時(shí)服務(wù)器端是接受了請(qǐng)求,而在返回時(shí)發(fā)生異常坝疼,這時(shí)服務(wù)器接受請(qǐng)求
//的狀態(tài)是成功的搜贤,此時(shí)再處理請(qǐng)求邏輯異常,將會(huì)進(jìn)入這個(gè)方法處理。需要ResponseStatus注解
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Result handle(Exception e) {
//如果異常為自定義異常就走自定義異常
if (e instanceof CustomizeException) {
CustomizeException girlException = (CustomizeException) e;
log.error("【自定義異扯坌祝】{}", girlException.getMessage());
return Result.error(girlException.getCode(), girlException.getMessage());
} else {
log.error("【系統(tǒng)異骋敲ⅲ】{}", e);
return Result.error(-1, "未知錯(cuò)誤");
}
}
}
5.測(cè)試
@ApiOperation(value = "全局捕獲異常測(cè)試", notes = "全局捕獲異常測(cè)試")
@PutMapping("code")
@ResponseBody
public Result ApiCode(@RequestBody Student student) {
if (student.getAge() == 0) {
throw new CustomizeException(ResultEnum.FAILURE, "測(cè)試");
}
return Result.success(student);
}