springboot自定义异常
SpringBoot自定义异常以及异常处理
在web项目中,我们可能需要给前端返回不同的提示码。例如:401表示没有权限,500代表位置异常,200代表请求成功等。但是这些提示码远远不能满足我们返回给前端的提示,可能还需要我们自定义错误码给前端,前端获取相应的错误码以及错误信息,展示到页面中。
使用自定义异常可以解决这些返回值,利用自定义异常以及对异常的处理,可以在返回的时候自定义我们的返回码以及错误信息等。
一、自定义异常类
/** *
@author: lxw * @Date: 2019/2/16 20:00
* @email:
* @Description: 自定义异常(继承运行时异常)
*/publicclass ExceptionUtils extends RuntimeException {
privatestaticfinallong serialVersionUID = 1L;
/**
* 错误编码
*/
privateint code;
/**
* 消息是否为属性文件中的Key
*/
privateboolean 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);
}
publicint getCode() {
return code;
}
publicvoid setCode(int code) {
this.code = code;
}
publicboolean isPropertiesKey() {
return propertiesKey;
}
publicvoid 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
publicclass 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: 自定义返回值
*/publicclass RUtils extends HashMap<String, Object> {
privatestaticfinallong serialVersionUID = 1L;
/**
* 默认正常返回,使用new RUtils()就可以返回
*/
public RUtils() {
put("code", 0);
}
/**
* 表示异常
*/
publicstatic RUtils error() {
return error(500, "未知异常,请联系管理员");
}
publicstatic RUtils error(String msg) {
return error(500, msg);
}
/**
* 自定义异常错误码
*/
publicstatic RUtils error(int code, String msg) {
RUtils r = new RUtils();
r.put("code", code);
r.put("msg", msg);
return r;
}
/**
* 带信息的正常返回
*/
publicstatic RUtils ok(String msg) {
RUtils r = new RUtils();
r.put("msg", msg);
return r;
}
publicstatic RUtils ok(Map<String, Object> map) {
RUtils r = new RUtils();
r.putAll(map);
return r;
}
publicstatic RUtils ok() {
returnnew RUtils();
}
@Override
public RUtils put(String key, Object value) {
super.put(key, value);
returnthis;
}
}
四、测试输出
/** *
@author: lxw * @Date: 2018/10/19 19:36
* @email: 1229703575@qq.com
* @Description: 测试文件
*/@RestController
@RequestMapping(
"/")publicclass 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}
以上是 springboot自定义异常 的全部内容, 来源链接: utcz.com/z/508698.html