springboot自定義異常

lxw_thinker發表於2019-02-20

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}

  

相關文章