天天看點

異常處理(自定義異常、不可預知異常)可預知異常處理異常捕獲類

異常處理(自定義異常、不可預知異常)可預知異常處理異常捕獲類

1、在controller、service、dao中程式員抛出自定義異常;

springMVC架構抛出架構異常類型;

springMVC架構和第三方元件抛出不可預知異常。

2、統一由異常捕獲類捕獲異常,并進行處理

3、捕獲到自定義異常則直接取出錯誤代碼及錯誤資訊,響應給使用者。

4、捕獲到非自定義異常類型首先從Map中找該異常類型是否對應具體的錯誤代碼,如果有則取出錯誤代碼和錯誤 資訊并響應給使用者,如果從Map中找不到異常類型所對應的錯誤代碼則統一為99999錯誤代碼并響應給使用者。

5、将錯誤代碼及錯誤資訊以Json格式響應給使用者

可預知異常處理

自定義異常

public class CustomException extends RuntimeException {

    //錯誤代碼
    ResultCode resultCode;

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


}
           

異常抛出類

public class ExceptionCast {
//使用此靜态方法抛出自定義異常
    public static void cast(ResultCode resultCode){
        throw new CustomException(resultCode);
    }
}
           

抛出異常

if(cmsPage1!=null){
        //頁面已經存在
        //抛出異常,異常内容就是頁面已經存在
        ExceptionCast.cast(CmsCode.CMS_ADDPAGE_EXISTSNAME);
    }  
           

啟動工程,掃描到異常捕獲的類ExceptionCatch

在springBoot的啟動類中添加

@ComponentScan(basePackages="")//掃描common工程下的類

異常捕獲類

/**
 * 統一異常捕獲類
 **/
@ControllerAdvice//控制器增強
public class ExceptionCatch {

    private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);

    //定義map,配置異常類型所對應的錯誤代碼
    private static ImmutableMap<Class<? extends Throwable>,ResultCode> EXCEPTIONS;
    //定義map的builder對象,去建構ImmutableMap
    protected static ImmutableMap.Builder<Class<? extends Throwable>,ResultCode> builder = ImmutableMap.builder();

    //捕獲CustomException此類異常
    @ExceptionHandler(CustomException.class)
    @ResponseBody//傳回json
    public ResponseResult customException(CustomException customException){
        //記錄日志
        LOGGER.error("catch exception:{}",customException.getMessage());
        ResultCode resultCode = customException.getResultCode();
        return new ResponseResult(resultCode);
    }
           
捕獲自定義異常
//捕獲Exception此類異常
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult exception(Exception exception){
        //記錄日志
        LOGGER.error("catch exception:{}",exception.getMessage());
        if(EXCEPTIONS == null){
            EXCEPTIONS = builder.build();//EXCEPTIONS建構成功
        }
        //從EXCEPTIONS中找異常類型所對應的錯誤代碼,如果找到了将錯誤代碼響應給使用者,如果找不到給使用者響應99999異常
        ResultCode resultCode = EXCEPTIONS.get(exception.getClass());
        if(resultCode !=null){
            return new ResponseResult(resultCode);
        }else{
            //傳回99999異常,從Map中找不到異常類型所對應的錯誤代碼則統一為99999錯誤代碼并響應給使用者
            return new ResponseResult(CommonCode.SERVER_ERROR);
        }


    }
           
存入Map
static {
        //定義異常類型所對應的錯誤代碼
        builder.put(HttpMessageNotReadableException.class,CommonCode.INVALID_PARAM);
    }
}
           

繼續閱讀