![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSPrdVYwx2VhpmVzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcuQzM0MzN0kTMxEjNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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);
}
}