1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        滿屏try...catch 。。。CTO:求求你不要再寫了!

        共 3747字,需瀏覽 8分鐘

         ·

        2021-02-17 14:50

        點擊上方[全棧開發(fā)者社區(qū)]右上角[...][設為星標?]

        前言

        軟件開發(fā)springboot項目過程中,不可避免的需要處理各種異常,spring mvc 架構中各層會出現(xiàn)大量的try {...} catch {...} finally {...}代碼塊,不僅有大量的冗余代碼,而且還影響代碼的可讀性。這樣就需要定義個全局統(tǒng)一異常處理器,以便業(yè)務層再也不必處理異常。

        推薦理由

        • 代碼復制到項目中通過簡單的配置即可實現(xiàn)

        • 可以靈活的根據(jù)自己的業(yè)務異常進行更細粒度的擴展

        實踐

        1 封裝統(tǒng)一返回結果類

        源代碼

        public?class?AjaxResult?{
        ?//是否成功
        ????private?Boolean?success;
        ????//狀態(tài)碼
        ????private?Integer?code;
        ????//提示信息
        ????private?String?msg;
        ????//數(shù)據(jù)
        ????private?Object?data;
        ????public?AjaxResult()?{

        ????}
        ????//自定義返回結果的構造方法
        ????public?AjaxResult(Boolean?success,Integer?code,?String?msg,Object?data)?{
        ????????this.success?=?success;
        ????????this.code?=?code;
        ????????this.msg?=?msg;
        ????????this.data?=?data;
        ????}
        ????//自定義異常返回的結果
        ????public?static?AjaxResult?defineError(BusinessException?de){
        ?????AjaxResult?result?=?new?AjaxResult();
        ????????result.setSuccess(false);
        ????????result.setCode(de.getErrorCode());
        ????????result.setMsg(de.getErrorMsg());
        ????????result.setData(null);
        ????????return?result;
        ????}
        ????//其他異常處理方法返回的結果
        ????public?static?AjaxResult?otherError(ErrorEnum?errorEnum){
        ?????AjaxResult?result?=?new?AjaxResult();
        ????????result.setMsg(errorEnum.getErrorMsg());
        ????????result.setCode(errorEnum.getErrorCode());
        ????????result.setSuccess(false);
        ????????result.setData(null);
        ????????return?result;
        ????}
        ?public?Boolean?getSuccess()?{
        ??return?success;
        ?}
        ?public?void?setSuccess(Boolean?success)?{
        ??this.success?=?success;
        ?}
        ?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;
        ?}
        ????
        }

        2 自定義異常封裝類

        源碼:

        public?class?BusinessException?extends?RuntimeException?{
        ?private?static?final?long?serialVersionUID?=?1L;
        ?/**
        ??*?錯誤狀態(tài)碼
        ??*/

        ?protected?Integer?errorCode;
        ?/**
        ??*?錯誤提示
        ??*/

        ?protected?String?errorMsg;

        ?public?BusinessException(){

        ?????}

        ?public?BusinessException(Integer?errorCode,?String?errorMsg)?{
        ?????????this.errorCode?=?errorCode;
        ?????????this.errorMsg?=?errorMsg;
        ?????}

        ?public?Integer?getErrorCode()?{
        ??return?errorCode;
        ?}

        ?public?void?setErrorCode(Integer?errorCode)?{
        ??this.errorCode?=?errorCode;
        ?}

        ?public?String?getErrorMsg()?{
        ??return?errorMsg;
        ?}

        ?public?void?setErrorMsg(String?errorMsg)?{
        ??this.errorMsg?=?errorMsg;
        ?}
        }

        3 錯誤枚舉,拒絕硬編碼

        源碼

        public?enum?ErrorEnum?{
        ?//?數(shù)據(jù)操作錯誤定義
        ?SUCCESS(200,?"成功"),
        ?NO_PERMISSION(403,"你沒得權限"),
        ?NO_AUTH(401,"未登錄"),
        ?NOT_FOUND(404,?"未找到該資源!"),
        ?INTERNAL_SERVER_ERROR(500,?"服務器異常請聯(lián)系管理員"),
        ?;

        ?/**?錯誤碼?*/
        ?private?Integer?errorCode;

        ?/**?錯誤信息?*/
        ?private?String?errorMsg;

        ?ErrorEnum(Integer?errorCode,?String?errorMsg)?{
        ??this.errorCode?=?errorCode;
        ??this.errorMsg?=?errorMsg;
        ?}

        ????public?Integer?getErrorCode()?{
        ????????return?errorCode;
        ????}

        ????public?String?getErrorMsg()?{
        ????????return?errorMsg;
        ????}
        }

        4 全局異常處理類

        源碼

        /**
        ?*?全局異常處理器
        ?*?
        ?*/

        @RestControllerAdvice
        public?class?GlobalExceptionHandler
        {
        ????private?static?final?Logger?log?=?LoggerFactory.getLogger(GlobalExceptionHandler.class);



        ????/**
        ?????*?處理自定義異常
        ?????*
        ?????*/

        ????@ExceptionHandler(value?=?BusinessException.class)
        ????public?AjaxResult?bizExceptionHandler(BusinessException?e)?
        {
        ?????log.error(e.getMessage(),?e);
        ????????return?AjaxResult.defineError(e);
        ????}

        ????/**
        ?????*處理其他異常
        ?????*
        ?????*/

        ????@ExceptionHandler(value?=?Exception.class)
        ????public?AjaxResult?exceptionHandler(?Exception?e)?
        {
        ??????log.error(e.getMessage(),?e);
        ????????return?AjaxResult.otherError(ErrorEnum.INTERNAL_SERVER_ERROR);
        ???????
        ????}

        }

        5 測試

        返回結果:

        END

        作者:小李子說程序

        www.toutiao.com/i6878184496945070604

        覺得本文對你有幫助?請分享給更多人

        關注「全棧開發(fā)者社區(qū)」加星標,提升全棧技能

        本公眾號會不定期給大家發(fā)福利,包括送書、學習資源等,敬請期待吧!

        如果感覺推送內容不錯,不妨右下角點個在看轉發(fā)朋友圈或收藏,感謝支持。


        好文章,留言、點贊、在看和分享一條龍吧??

        瀏覽 49
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            aa在线免费观看 | 91丨色丨国产熟女 蘑菇 | 水蜜桃一区 | abo摁着强进了失禁好爽po文 | 日韩精品无码一区AAAA片 | 午夜精品一区二区三区在线成人 | 成人AV一区二区三区婷婷 | 国产精品香蕉 | 久久久久久看片 | 操逼逼电影 |