springboot自定义异常和全局异常处理

Posted big-cut-cat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot自定义异常和全局异常处理相关的知识,希望对你有一定的参考价值。

模拟开发过程中的异常处理:

场景:

  如果不对异常处理,返回给前端的将是一个异常错误页日志

  所以要异常处理

首先准备个工具类:作为返回给前端的JsonData数据封装:

  此类也可以作为工具类直接使用。

package net.myclass.myvideo.domain;

import java.io.Serializable;

/**
 * 功能描述:工具类
 *
 * <p> 创建时间:May 14, 2018 7:58:06 PM </p>
 */
public class JsonData implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private Integer code; // 状态码 0 表示成功,1表示处理中,-1表示失败
    private Object data; // 数据
    private String msg;// 描述

    public JsonData() {
    }

    public JsonData(Integer code, Object data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }

    // 成功,传入数据
    public static JsonData buildSuccess() {
        return new JsonData(0, null, null);
    }

    // 成功,传入数据
    public static JsonData buildSuccess(Object data) {
        return new JsonData(0, data, null);
    }

    // 失败,传入描述信息
    public static JsonData buildError(String msg) {
        return new JsonData(-1, null, msg);
    }

    // 失败,传入描述信息,状态码
    public static JsonData buildError(String msg, Integer code) {
        return new JsonData(code, null, msg);
    }

    // 成功,传入数据,及描述信息
    public static JsonData buildSuccess(Object data, String msg) {
        return new JsonData(0, data, msg);
    }

    // 成功,传入数据,及状态码
    public static JsonData buildSuccess(Object data, int code) {
        return new JsonData(code, data, null);
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "JsonData [code=" + code + ", data=" + data + ", msg=" + msg
                + "]";
    }

}

 

下面开始处理异常:

1.自定义异常类的开发:

package net.myclass.myvideo.exception;


/**
 * 自定义异常类
 */
public class MyException extends RuntimeException {


    /**
     * 状态码
     */
    private Integer code;
    /**
     * 异常消息
     */
    private String msg;




    public MyException(int code, String msg){
        super(msg);
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

 

2.异常管理类的开发:

  配置value,捕获异常;

  当捕获的异常为自定义异常,则处理自定义异常

  当捕获的为其他异常,统一处理为全局异常(未知错误)

  注意:

    如果value=MyException.class,则只处理MyException,不用加下面的判断条件直接return即可

package net.myclass.myvideo.exception;


import net.xdclass.xdvideo.domain.JsonData;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 异常处理控制器
 */
@ControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public JsonData Handler(Exception e){

        if(e instanceof MyException){
            MyException myException =  (MyException)e;
            return JsonData.buildError(myException.getMsg(),myException.getCode());
        }else{
            return JsonData.buildError("全局异常,未知错误");
        }
    }


}

 这样封装之后一旦捕获了异常,就会返回一个JsonData给前端了

以上是关于springboot自定义异常和全局异常处理的主要内容,如果未能解决你的问题,请参考以下文章

重学SpringBoot系列之统一全局异常处理

SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...

SpringMvc,Springboot统一校验自定义异常全局异常处理

SpringMvc,Springboot统一校验自定义异常全局异常处理

Spring Boot - 使用 RestControllerAdvice 的全局自定义异常处理机制

spring-- springboot配置全局异常处理器