欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot自定义异常

程序员文章站 2022-11-18 08:18:58
SpringBoot自定义异常以及异常处理 在web项目中,我们可能需要给前端返回不同的提示码。例如:401表示没有权限,500代表位置异常,200代表请求成功等。但是这些提示码远远不能满足我们返回给前端的提示,可能还需要我们自定义错误码给前端,前端获取相应的错误码以及错误信息,展示到页面中。 使用 ......

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}