Spring Boot——全局捕獲異常

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);
    }
其實(shí)定義通用返回對(duì)象的方法有很多種寫法,這種屬于中規(guī)中矩吧耕陷,僅供參考掂名,個(gè)人筆記,若有幸被瀏覽到哟沫,歡迎各位前輩指點(diǎn)完善
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饺蔑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗜诀,更是在濱河造成了極大的恐慌猾警,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隆敢,死亡現(xiàn)場(chǎng)離奇詭異发皿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拂蝎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門穴墅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人温自,你說我怎么就攤上這事玄货。” “怎么了悼泌?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵松捉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我馆里,道長(zhǎng)惩坑,這世上最難降的妖魔是什么掉盅? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮以舒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慢哈。我一直安慰自己蔓钟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布卵贱。 她就那樣靜靜地躺著滥沫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪键俱。 梳的紋絲不亂的頭發(fā)上兰绣,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音编振,去河邊找鬼缀辩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛踪央,可吹牛的內(nèi)容都是我干的臀玄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼畅蹂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼健无!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起液斜,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤累贤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后少漆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臼膏,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年检疫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讶请。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屎媳,死狀恐怖夺溢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烛谊,我是刑警寧澤风响,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站丹禀,受9級(jí)特大地震影響状勤,放射性物質(zhì)發(fā)生泄漏鞋怀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一持搜、第九天 我趴在偏房一處隱蔽的房頂上張望密似。 院中可真熱鬧,春花似錦葫盼、人聲如沸残腌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抛猫。三九已至,卻和暖如春孩灯,著一層夾襖步出監(jiān)牢的瞬間闺金,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工峰档, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留败匹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓面哥,卻偏偏與公主長(zhǎng)得像哎壳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尚卫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容