springboot自定义异常
程序员文章站
2022-04-08 20:29:43
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}