SpringBoot自定義異常以及異常處理
在web專案中,我們可能需要給前端返回不同的提示碼。例如:401表示沒有許可權,500代表位置異常,200代表請求成功等。但是這些提示碼遠遠不能滿足我們返回給前端的提示,可能還需要我們自定義錯誤碼給前端,前端獲取相應的錯誤碼以及錯誤資訊,展示到頁面中。
使用自定義異常可以解決這些返回值,利用自定義異常以及對異常的處理,可以在返回的時候自定義我們的返回碼以及錯誤資訊等。
一、自定義異常類
/** * @author: lxw * @Date: 2019/2/16 20:00 * @email: * @Description: 自定義異常(繼承執行時異常) */ public class ExceptionUtils extends RuntimeException { private static final long serialVersionUID = 1L; /** * 錯誤編碼 */ private int code; /** * 訊息是否為屬性檔案中的Key */ private boolean propertiesKey = true; /** * 構造一個基本異常. * * @param message 資訊描述 */ public ExceptionUtils(String message) { super(message); } /** * 構造一個基本異常. * * @param code 錯誤編碼 * @param message 資訊描述 */ public ExceptionUtils(int code, String message) { this(code, message, true); } /** * 構造一個基本異常. * * @param code 錯誤編碼 * @param message 資訊描述 */ public ExceptionUtils(int code, String message, Throwable cause) { this(code, message, cause, true); } /** * 構造一個基本異常. * * @param code 錯誤編碼 * @param message 資訊描述 * @param propertiesKey 訊息是否為屬性檔案中的Key */ public ExceptionUtils(int code, String message, boolean propertiesKey) { super(message); this.setCode(code); this.setPropertiesKey(propertiesKey); } /** * 構造一個基本異常. * * @param code 錯誤編碼 * @param message 資訊描述 */ public ExceptionUtils(int code, String message, Throwable cause, boolean propertiesKey) { super(message, cause); this.setCode(code); this.setPropertiesKey(propertiesKey); } /** * 構造一個基本異常. * * @param message 資訊描述 * @param cause 根異常類(可以存入任何異常) */ public ExceptionUtils(String message, Throwable cause) { super(message, cause); } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public boolean isPropertiesKey() { return propertiesKey; } public void setPropertiesKey(boolean propertiesKey) { this.propertiesKey = propertiesKey; } }
二、自定義異常處理
import com.modules.common.utils.RUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.NoHandlerFoundException; /** * @author: lxw * @Date: 2019/2/16 20:00 * @email: * @Description: 自定義異常處理 */ @RestControllerAdvice public class RExceptionUtilsHandler { private Logger logger = LoggerFactory.getLogger(getClass()); /** * 處理自定義異常 */ @ExceptionHandler(ExceptionUtils.class) public RUtils handleRRException(ExceptionUtils e) { RUtils r = new RUtils(); r.put("code", e.getCode()); r.put("msg", e.getMessage()); return r; } /** * 未找到路徑異常處理 */ @ExceptionHandler(NoHandlerFoundException.class) public RUtils handlerNoFoundException(Exception e) { logger.error(e.getMessage(), e); return RUtils.error(404, "路徑不存在,請檢查路徑是否正確"); } /** * 資料庫異常處理 */ @ExceptionHandler(DuplicateKeyException.class) public RUtils handleDuplicateKeyException(DuplicateKeyException e) { logger.error(e.getMessage(), e); return RUtils.error("資料庫中已存在該記錄"); } /** * 普通異常處理 */ @ExceptionHandler(Exception.class) public RUtils handleException(Exception e) { logger.error(e.getMessage(), e); return RUtils.error(); } }
三、自定義返回
package com.modules.common.utils; import java.util.HashMap; import java.util.Map; /** * @author: lxw * @Date: 2019/2/19 11:19 * @email: * @Description: 自定義返回值 */ public class RUtils extends HashMap<String, Object> { private static final long serialVersionUID = 1L; /** * 預設正常返回,使用new RUtils()就可以返回 */ public RUtils() { put("code", 0); } /** * 表示異常 */ public static RUtils error() { return error(500, "未知異常,請聯絡管理員"); } public static RUtils error(String msg) { return error(500, msg); } /** * 自定義異常錯誤碼 */ public static RUtils error(int code, String msg) { RUtils r = new RUtils(); r.put("code", code); r.put("msg", msg); return r; } /** * 帶資訊的正常返回 */ public static RUtils ok(String msg) { RUtils r = new RUtils(); r.put("msg", msg); return r; } public static RUtils ok(Map<String, Object> map) { RUtils r = new RUtils(); r.putAll(map); return r; } public static RUtils ok() { return new RUtils(); } @Override public RUtils put(String key, Object value) { super.put(key, value); return this; } }
四、測試輸出
/** * @author: lxw * @Date: 2018/10/19 19:36 * @email: 1229703575@qq.com * @Description: 測試檔案 */ @RestController @RequestMapping("/") public class TestController { /** * 測試自定義異常 * * @return RUtils */ @ApiOperation(value = "測試自定義異常", notes = "測試自定義異常") @GetMapping(value = "/exceptionTest") public RUtils exceptionTest() { String msg = new ExceptionUtils(500, "測試異常").getMessage(); int errorCode = new ExceptionUtils(500, "測試異常").getCode(); return RUtils.error(errorCode, msg); } }
五、輸出結果
{"msg":"測試異常","code":500}