springboot2.0 快速进行统一异常处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljk126wy/article/details/83243900

我们可以通过@ControllerAdvice (控制增强)+ @ExceptionHandler 进行统一异常处理,ExceptionHandler注解可以设置全局处理控制里的异常类型来拦截要处理的异常。 例如:@ExceptionHandler(value = Exception.class)

定义restfull 返回json 数据的消息实例,其中包含 code:错误码,0表示没有异常信息。 message:异常提示信息 date:无异常返回具体内容。

package cn.lijunkui.unifiedException.message;
/**
 * restfull 请求返回json 信息实体类
 * @author lijunkui
 * @param <T>
 */
public class ReturnMessage<T> {
	
	private Integer code;//错误码
	private String message;//提示信息
	private T date;//返回具体内容
	
	public Integer getCode() {
		return code;
	}
	public void setCode(Integer code) {
		this.code = code;
	}
	public ReturnMessage(Integer code, String message, T date) {
		super();
		this.code = code;
		this.message = message;
		this.date = date;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public T getDate() {
		return date;
	}
	public void setDate(T date) {
		this.date = date;
	}
	
}

处理 返回json 数据的消息实例工具类,主要包含是3个方法 1 成功处理含实体数据 2 成功处理 没有实体数据 3 失败处理 

package cn.lijunkui.unifiedException.message;
/**
 * json 消息处理工具类
 * @author Administrator
 *
 */
public class ReturnMessageUtil {
	/**
	 * 无异常 请求成功并有具体内容返回
	 * @param object
	 * @return
	 */
	public static ReturnMessage<Object> sucess(Object object) {
		ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",object);
		return message;
	}
	/**
	 * 无异常 请求成功并无具体内容返回
	 * @return
	 */
	public static ReturnMessage<Object> sucess() {
		ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",null);
		return message;
	}
	/**
	 * 有自定义错误异常信息
	 * @param code
	 * @param msg
	 * @return
	 */
	public static ReturnMessage<Object> error(Integer code,String msg) {
		ReturnMessage<Object> message = new ReturnMessage<Object>(code,msg,null);
		return message;
	}
}

 自定以系统异常

package cn.lijunkui.unifiedException.customexception;

public class SbException extends RuntimeException{
	
	
	private static final long serialVersionUID = -8201518085425482189L;

	public Integer getCode() {
		return code;
	}
	public void setCode(Integer code) {
		this.code = code;
	}
	private Integer code;
	
	public SbException(Integer code,String message) {
		super(message);
		this.code = code;
	}
	
}

进行异常的统一拦截处理 

package cn.lijunkui.unifiedException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import cn.lijunkui.unifiedException.customexception.SbException;
import cn.lijunkui.unifiedException.message.ReturnMessage;
import cn.lijunkui.unifiedException.message.ReturnMessageUtil;



//@ControllerAdvice
@RestControllerAdvice
public class ExceptionHandle {
	private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
	@ExceptionHandler(value = Exception.class)
	//@ResponseBody
	public ReturnMessage<Object> handle(Exception exception) {
		if(exception instanceof SbException) {
			SbException sbexception = (SbException)exception;
			return ReturnMessageUtil.error(sbexception.getCode(), sbexception.getMessage());
		}else {
			logger.error("系统异常 {}",exception);
			return ReturnMessageUtil.error(-1, "未知异常"+exception.getMessage());
		}
	}
}

 进行测试 分别测试自定义异常和系统异常。

package cn.lijunkui.unifiedException.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.lijunkui.unifiedException.customexception.SbException;

@RestController
@RequestMapping("/error")
public class DemoException {
	
	@GetMapping(value = "custome")
	public void customException() {
		SbException sbe = new SbException(100, "这个是自定义异常!");
		throw sbe;
	}
	@GetMapping(value = "unknown")
	public void unknownException() {
		int i = 0;
		int b = 1/i;
	}
}

测试结果:

demo版本说明:

开发工具:Spring Tool Suite (STS)

springboot版本:2.0.5.RELEASE

jdk版本:1.8.0_144

猜你喜欢

转载自blog.csdn.net/ljk126wy/article/details/83243900