springboot自定义异常RESTful返回异常

1.自定义异常类

package com.zhx.common.exception;

import com.zhx.common.model.ErrorCode;

/**
 * @Author: SimonHu
 * @Date: 2019/8/23 13:59
 * @Description:i自定义异常
 */
public class CustomException extends RuntimeException {
    private String code;
    
    /**
     * @return
     * @Description:无参构造函数
     * @Author:SimonHu
     * @Date: 2019/8/23 14:00
     */
    public CustomException() {
        super();
    }
    
    /**
     * @param message
     * @return
     * @Description:用详细信息指定一个异常
     * @Author:SimonHu
     * @Date: 2019/8/23 14:00
     */
    public CustomException(String message) {
        super(message);
        this.code = ErrorCode.ACCESS_ERROR.getCode();
    }
    
    public CustomException(String code, String message) {
        super(message);
        this.code = code;
    }
    
    /**
     * @param message
     * @param cause
     * @return
     * @Description:用指定的详细信息和原因构造一个新的异常
     * @Author:SimonHu
     * @Date: 2019/8/23 14:01
     */
    public CustomException(String message, Throwable cause) {
        super(message, cause);
    }
    
    /**
     * @param cause
     * @return
     * @Description:用指定原因构造一个新的异常
     * @Author:SimonHu
     * @Date: 2019/8/23 14:01
     */
    public CustomException(Throwable cause) {
        super(cause);
    }
    
    public String getCode() {
        return code;
    }
    
    public void setCode(String code) {
        this.code = code;
    }
}

2.枚举错误码

package com.zhx.common.model;

/**
 * @Author: SimonHu
 * @Date: 2019/8/21 15:47
 * @Description:
 */
public enum ErrorCode {
    ACCESS_ERROR("403", "访问被禁止"),
    BRADN_GOODS_INFO_ERROR("209", "查询不到品牌对应产品信息"),
    DECIPHER_FAIL("208", "解密失败"),
    BUSSINESSTYPE_NULL("207", "bussinessType不能为空"),
    REQUEST_ID_NULL("206", "requestId不能为空"),
    REQUEST_DOUBLE("205", "提交请求重复"),
    REQUEST_FAIL("204", "查询信息失败"),
    SIGN_ERROR("203", "签名错误"),
    PARAM_NOT_FULL("202", "请求参数不全"),
    SYS_ERROR("500", "系统错误");
    
    ErrorCode(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    
    public static String getCodeInfo(String code) {
        for (ErrorCode info : ErrorCode.values()) {
            if (code.equals(info.getCode())) {
                return info.getMsg();
            }
        }
        return "其他错误";
    }
    
    private String code;
    private String msg;
    
    @Override
    public String toString() {
        return "ErrorCodeEnum{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                '}';
    }
    
    public String getCode() {
        return code;
    }
    
    public void setCode(String code) {
        this.code = code;
    }
    
    public String getMsg() {
        return msg;
    }
    
    public void setMsg(String msg) {
        this.msg = msg;
    }
    
    public static void main(String[] args) {
        System.out.println(ErrorCode.REQUEST_FAIL.getCode());
        System.out.println(ErrorCode.REQUEST_FAIL.getMsg());
    }
}

3.全局异常捕获类

package com.zhx.common.config;

import com.zhx.common.exception.CustomException;
import com.zhx.common.model.ErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author: SimonHu
 * @Date: 2019/8/21 10:17
 * @Description:全局异常捕获
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(getClass().getName());
    
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result jsonHandler(HttpServletRequest request, Exception e) throws Exception {
        if ("org.apache.catalina.connector.ClientAbortException".equals(e.getClass().getName())) {
            logger.error("发生clientAbortException");
            return null;
        }
        logger.error("-----------jsonHandler---错误信息----------:", e);
        return Result.error(ErrorCode.SYS_ERROR.getCode(),e.getMessage(), "");
    }
    
    /**
     * @param request
     * @param e
     * @return com.zhx.common.Result
     * @Description:i自定义异常
     * @Author:SimonHu
     * @Date: 2019/8/23 14:26
     */
    @ExceptionHandler(value = CustomException.class)
    @ResponseBody
    public Result customException(HttpServletRequest request, CustomException e) {
        logger.error("---------customException-----错误信息----------:"+e.getMessage());
        logger.error(getErrrorInfo(e,e.getCode(),e.getMessage(),2));
        return Result.error(e.getCode(), e.getMessage(), "");
    }
    
    /**
     * @param ex
     * @param row 控制打印行数
     * @return java.lang.String
     * @Description:获取错误信息并记录日志
     * @Author:SimonHu
     * @Date: 2019/8/26 16:04
     */
    private String getErrrorInfo(Exception ex, String code, String msg,int row) {
        StringBuilder sb = new StringBuilder();
        StackTraceElement[] error = ex.getStackTrace();
        int i = 0;
        for (StackTraceElement stackTraceElement : error) {
            sb.append(stackTraceElement);
            sb.append("\r\n");
            i++;
            if (i >= row) {
                break;
            }
        }
        return sb.toString();
    }
}

4.针对404和500错误信息我们需要添加两个配置:

#spring配置
spring:
  mvc:
    #出现错误时, 直接抛出异常
    throw-exception-if-no-handler-found: true
  resources:
    #不要为我们工程中的资源文件建立映射
    add-mappings: false

 

 

 

 这样错误信息会以json格式返回,result我统一返回的500,实际这是个404错误。

5.抛出自定义异常信息

 private String getEcardsGoodsIdByFacePrice(String brandId) {
        Map configMap = commonService.selectGateWayGoodsId(brandId);
        if(null==configMap||configMap.isEmpty()){
            throw new CustomException(ErrorCode.BRADN_GOODS_INFO_ERROR.getCode(),brandId+ErrorCode.BRADN_GOODS_INFO_ERROR.getMsg());
        }
        String str = String.valueOf(configMap.get("gateway_goods_id"));
        return str;
    }

 

posted @ 2019-10-17 14:09  748573200000  阅读(951)  评论(0编辑  收藏  举报