異常問題-異常處理

5 異常處理

5.1 異常處理的問題分析

  1. 示例代碼
//添加頁面 
    public CmsPageResult add(CmsPage cmsPage) { 
 
   
        //校驗頁面是否存在,根據頁面名稱、站點Id、頁面webpath查詢 
        CmsPage cmsPage1 = cmsPageRepository.findByPageNameAndSiteIdAndPageWebPath(cmsPage.getPageName(), cmsPage.getSiteId(), cmsPage.getPageWebPath());
        if (cmsPage1 == null) { 
 
   
            cmsPage.setPageId(null);
            //添加頁面主鍵由spring data 自動生成 
            cmsPageRepository.save(cmsPage);
            //返回結果 
            CmsPageResult cmsPageResult = new CmsPageResult(CommonCode.SUCCESS, cmsPage);
            return cmsPageResult;
        }
        return new CmsPageResult(CommonCode.FAIL, null);
    }

問題:java

  1. 上邊的代碼只要操做不成功僅向用戶返回「錯誤代碼:11111,失敗信息:操做失敗」,沒法區別具體的錯誤信 息。
  2. service方法在執行過程出現異常在哪捕獲?在service中須要都加try/catch,若是在controller也須要添加 try/catch,代碼冗餘嚴重且不易維護。

解決方案:程序員

  1. 在Service方法中的編碼順序是先校驗判斷,有問題則拋出具體的異常信息,最後執行具體的業務操做,返回成 功信息。
  2. 在統一異常處理類中去捕獲異常,無需controller捕獲異常,向用戶返回統一規範的響應信息。

代碼模板以下:web

//添加頁面 
    public CmsPageResult add(CmsPage cmsPage) { 
 
   
        //校驗cmsPage是否爲空 
        if (cmsPage == null) { 
 
   
            //拋出異常,非法請求 
            // ... 
        }
        //根據頁面名稱查詢(頁面名稱已在mongodb建立了惟一索引) 
        CmsPage cmsPage1 = cmsPageRepository.findByPageNameAndSiteIdAndPageWebPath(cmsPage.getPageName(), cmsPage.getSiteId(), cmsPage.getPageWebPath());
        //校驗頁面是否存在,已存在則拋出異常 
        if (cmsPage1 != null) { 
 
   
            //拋出異常,已存在相同的頁面名稱 
            // ... 
        }
        cmsPage.setPageId(null);
        //添加頁面主鍵由spring data 自動生成 
        CmsPage save = cmsPageRepository.save(cmsPage);
        //返回結果 
        CmsPageResult cmsPageResult = new CmsPageResult(CommonCode.SUCCESS, save);
        return cmsPageResult;
    }

5.2 異常處理流程

系統對異常的處理使用統一的異常處理流程:spring

  1. 自定義異常類型。
  2. 自定義錯誤代碼及錯誤信息。
  3. 對於可預知的異常由程序員在代碼中主動拋出,由SpringMVC統一捕獲。可預知異常是程序員在代碼中手動拋出本系統定義的特定異常類型,因爲是程序員拋出的異常,一般異常信息比較 齊全,程序員在拋出時會指定錯誤代碼及錯誤信息,獲取異常信息也比較方便。
  4. 對於不可預知的異常(運行時異常)由SpringMVC統一捕獲Exception類型的異常。不可預知異常一般是因爲系統出現bug、或一些不要抗拒的錯誤(好比網絡中斷、服務器宕機等),異常類型爲 RuntimeException類型(運行時異常)。
  5. 可預知的異常及不可預知的運行時異常最終會採用統一的信息格式(錯誤代碼+錯誤信息)來表示,最終也會隨 請求響應給客戶端。

異常拋出及處理流程:
在這裏插入圖片描述mongodb

  1. 在controller、service、dao中程序員拋出自定義異常;springMVC框架拋出框架異常類型
  2. 統一由異常捕獲類捕獲異常,並進行處理
  3. 捕獲到自定義異常則直接取出錯誤代碼及錯誤信息,響應給用戶。
  4. 捕獲到非自定義異常類型首先從Map中找該異常類型是否對應具體的錯誤代碼,若是有則取出錯誤代碼和錯誤 信息並響應給用戶,若是從Map中找不到異常類型所對應的錯誤代碼則統一爲99999錯誤代碼並響應給用戶。
  5. 將錯誤代碼及錯誤信息以Json格式響應給用戶。

5.3 可預知異常處理

5.3.1 自定義異常類

  1. 代碼示例
public class CustomException extends RuntimeException { 
 
   
    private ResultCode resultCode;

    public CustomException(ResultCode resultCode) { 
 
   
        //異常信息爲錯誤代碼+異常信息 
        super("錯誤代碼:" + resultCode.code() + "錯誤信息:" + resultCode.message());
        this.resultCode = resultCode;
    }

    public ResultCode getResultCode() { 
 
   
        return this.resultCode;
    }
}

5.3.2 異常拋出類

  1. 代碼示例
public class ExceptionCast { 
 
   
    //使用此靜態方法拋出自定義異常 
    public static void cast(ResultCode resultCode) { 
 
   
        throw new CustomException(resultCode);
    }
}

5.3.3 異常捕獲類

  1. 代碼示例
public class ExceptionCatch { 
 
   
    //捕獲 CustomException異常 
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResponseResult customException(CustomException e) { 
 
   
        ResultCode resultCode = e.getResultCode();
        ResponseResult responseResult = new ResponseResult(resultCode);
        return responseResult;
    }
}

本文同步分享在 博客「cwl_java」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。服務器

相關文章
相關標籤/搜索