Spring全局异常处理 自定义异常


1. 自定义业务异常类

/**
 * 自定义service层异常类 RuntimeException 可以不捕获也没事
 */
public class ServiceException extends RuntimeException {

	private static final long serialVersionUID = 1L;

	private ResultCode resultCode;

	public ServiceException(ResultCode resultCode) {
		this(resultCode.message());
		this.resultCode = resultCode;
	}

	private ServiceException(String message) {
		super(message);
	}

	public ResultCode getResultCode() {
		return resultCode;
	}

	public void setResultCode(ResultCode resultCode) {
		this.resultCode = resultCode;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}
}

2. 创建统一的返回体

package cn.com.wind.sprtes.exception;

import java.io.Serializable;

/**
 * 统一Controller中RESTFul风格接口返回的结果
 */
public class Result implements Serializable {

	private static final long serialVersionUID = 1L;

	// 状态码
	private Integer code;
	// 错误信息
	private String msg;
	// 响应回去的数据
	private Object data;

	private Result() {
	}

	private Result(Integer code, String msg) {
		this.code = code;
		this.msg = msg;
	}

	private void setResultCode(ResultCode code) {
		this.code = code.code();
		this.msg = code.message();
	}

	/**
	 * 操作失败,自定义code和msg
	 */
	public static Result failure(Integer code, String msg) {
		Result result = new Result(code, msg);
		return result;
	}

	/**
	 * 操作成功,没有返回的数据
	 */
	public static Result success() {
		Result result = new Result();
		result.setResultCode(ResultCode.SUCCESS);
		return result;
	}

	/**
	 * 操作成功,有返回的数据
	 */
	public static Result success(Object data) {
		Result result = new Result();
		result.setResultCode(ResultCode.SUCCESS);
		result.setData(data);
		return result;
	}

	/**
	 * 操作失败,没有返回的数据
	 */
	public static Result failure(ResultCode resultCode) {
		Result result = new Result();
		result.setResultCode(resultCode);
		return result;
	}

	/**
	 * 操作失败,有返回的数据
	 */
	public static Result failure(ResultCode resultCode, Object data) {
		Result result = new Result();
		result.setResultCode(resultCode);
		result.setData(data);
		return result;
	}

	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;
	}

	public Object getData() {
		return data;
	}

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

}

3. 枚举 创建统一异常码

/**
 * 统一并自定义返回状态码,如有需求可以另外增加
 */
public enum ResultCode {

	/* 成功状态码 */
	SUCCESS(1, "操作成功"),

	/* 默认失败状态码 */
	ERROR(2, "操作失败,未知制定错误信息"),

	/* 参数错误:10001-19999 */
	PARAM_IS_INVALID(10001, "参数无效"), 
	PARAM_IS_BLANK(10002, "参数为空"), 
	PARAM_TYPE_BIND_ERROR(10003, "参数类型错误"),
	PARAM_NOT_COMPLETE(10004, "参数缺失"),

	/* 用户错误:20001-29999 */
	USER_NOT_LOGIN(20001, "用户未登录"), 
	USER_LOGIN_ERROR(20002, "账号不存在或密码错误"), 
	USER_ACCOUNT_FORBIDDEN(20003, "账号已被禁用"),
	USER_NOT_EXIST(20004, "用户不存在"), 
	USER_HAS_EXISTED(20005, "用户已存在"), 
	USER_NOT_EMPTY(20006, "用户名不能为空"),
	USER_MUST_BE_IS_NUMBER_AND_LETTER(20007, "密码只能为数字或者字母"), 
	USER_BACTH_DELETE_ERROR(20008, "批量删除报错"),

	/* 业务错误:30001-39999 */
	SPECIFIED_QUESTIONED_USER_NOT_EXIST(30001, "业务逻辑出现问题"),

	/* 系统错误:40001-49999 */
	SYSTEM_INNER_ERROR(40001, "系统内部错误,请稍后重试"),

	/* 数据错误:50001-599999 */
	DATA_NONE(50001, "数据未找到"), 
	DATA_WRONG(50002, "数据错误"), 
	DATA_EXISTED(50003, "数据已存在"),

	/* 接口错误:60001-69999 */
	INTERFACE_INNER_INVOKE_ERROR(60001, "内部系统接口调用异常"), 
	INTERFACE_OUTTER_INVOKE_ERROR(60002, "外部系统接口调用异常"),
	INTERFACE_FORBID_VISIT(60003, "该接口禁止访问"), 
	INTERFACE_ADDRESS_INVALID(60004, "接口地址无效"),
	INTERFACE_REQUEST_TIMEOUT(60005, "接口请求超时"),

	/* 权限错误:70001-79999 */
	PERMISSION_NO_ACCESS(70001, "无访问权限"),

	/* 角色部分错误:80001-89999 */
	ROLE_IS_EXIST(80001, "角色不存在"), 
	ROLE_MSG_NOT_AGREEMENT(80002, "角色信息不一致");

	private Integer code;

	private String message;

	ResultCode(Integer code, String message) {
		this.code = code;
		this.message = message;
	}

	public Integer code() {
		return this.code;
	}

	public String message() {
		return this.message;
	}
}

4. 创建全局异常处理类

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器 把异常到controller层 这里会获取看看异常对不对,全都交给全局异常处理 和swagger没关系
 * 
 * 异常得到期望的返回格式,这里就需要用到了@ControllerAdvice 或者RestControllerAdvice(如果全部异常处理返回json,
 * 那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,
 * 这样在方法上就可以不需要添加 @ResponseBodyServiceException
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

	//可以放入自定义异常类 , 不一定是要Exception ,可以是继承了运行时异常的类
	@ResponseBody
	@ExceptionHandler(Exception.class)
	public Object handleException(Exception e) {
		//异常具体位置
		StackTraceElement[] stackTrace = e.getStackTrace();
		Result result = null;
		if (e instanceof ServiceException) {
			result = Result.failure(((ServiceException) e).getResultCode());
		} else {
			result = Result.failure(500, "服务器意外错误:" + e.getMessage());
		}
		return result;
	}

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值