springboot自定义异常,全局异常处理

1、自定义异常类

package com.smc.exception;

import com.smc.constants.Constants;

/**
 * 
 * @ClassName: BusinessException 
 * @description: 业务自定义异常
 * @author liuxk  
 * @version V1.0
 */
public class BusinessException extends RuntimeException{
	private static final long serialVersionUID = -778223413321636516L;
	
	private Integer code;
	private String msg;
    private Throwable exception;
	    
	public BusinessException(String msg) {
		super(msg);
		this.code=Constants.HTTP_RES_CODE_500;
		this.msg=msg;
	}
	
	public BusinessException(Integer code,String msg) {
		super(msg);
		this.code=code;
		this.msg=msg;
	}
	
	public BusinessException(String msg, Throwable e) {
		super(msg,e);
		this.code=Constants.HTTP_RES_CODE_500;
		this.msg = msg;
	    this.exception = e;
	}
	
	public BusinessException(Integer code,String msg, Throwable e) {
		super(msg,e);
		this.code=code;
		this.msg = msg;
	    this.exception = e;
	}
	
	public Integer getCode() {
		return code;
	}

	public String getMsg() {
		return msg;
	}

	public Throwable getException() {
		return exception;
	}
	
}

2、自定义异常使用

String token="";
if(StringUtil.isEmpty(token)) {
     throw new BusinessException(">>>>>>>>自定义异常处理");
}

3、全局异常处理类

package com.smc.aop.error;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.jms.Queue;
import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONObject;
import com.smc.exception.BusinessException;
import com.smc.mqlog.producer.MessageProducer;

import lombok.extern.slf4j.Slf4j;

/**
 * 
 * @ClassName: GlobalExceptionHandler 
 * @description: 全局捕获异常
 * @author liuxk  
 * @version V1.0
 */
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
	@Autowired
	private MessageProducer<JSONObject> messageProducer;
	
	@Resource(name = "mqexception")
	private Queue mqexception;

	@Autowired
	private ThreadPoolTaskExecutor threadPoolTaskExecutor;

	/**
	 * 运行时异常
	 * @param request
	 * @param e
	 * @return
	 */
	@ExceptionHandler(RuntimeException.class)
	@ResponseBody
	public JSONObject exceptionHandler(HttpServletRequest request,Exception ex) {
		log.error("###全局捕获异常###,RuntimeException api:{}, errcode:{}, msg:{}", request.getRequestURI(), 500, ex.getMessage());
		log.error("###全局捕获异常###,RuntimeException ", ex);
		JSONObject errorJson = new JSONObject();
		JSONObject logJson = new JSONObject();
		String LogGlobalKey=request.getHeader("LogGlobalKey");
		logJson.put("log_global_key", LogGlobalKey);
		logJson.put("opt_user", "0000a6acc784464180228eeb1761c48c");
		// 请求时间
		logJson.put("request_time", new Date());
		// 请求URL
		logJson.put("request_url", request.getRequestURL().toString());
		// 错误内容
		logJson.put("error_content", ex.getCause()+"###"+ex.getMessage());
		errorJson.put("request_error", logJson);
		//发送消息到activeMQ
//		messageProducer.sendMessage(mqexception,errorJson);
		threadPoolTaskExecutor.execute(new LogThread(mqexception,errorJson));
		
		JSONObject result = new JSONObject(true);
		result.put("code", 500);
		result.put("msg", "系统错误");
		result.put("data", null);
		result.put("exception", ex.getCause());
		return result;
	}
	
	/**
	 * 业务自定义异常
	 * @param request
	 * @param e
	 * @return
	 */
	@ExceptionHandler(BusinessException.class)
	@ResponseBody
	public JSONObject handleBusinessException(HttpServletRequest request,Exception ex) {
		log.error("###全局捕获异常###,BusinessException api:{}, errcode:{}, msg:{}", request.getRequestURI(), 500, ex.getMessage());
		log.error("###全局捕获异常###,BusinessException ", ex);
		BusinessException businessException=(BusinessException) ex;
		JSONObject errorJson = new JSONObject();
		JSONObject logJson = new JSONObject();
		String LogGlobalKey=request.getHeader("LogGlobalKey");
		logJson.put("log_global_key", LogGlobalKey);
		logJson.put("opt_user", "0000a6acc784464180228eeb1761c48c");
		// 请求时间
		logJson.put("request_time", new Date());
		// 请求URL
		logJson.put("request_url", request.getRequestURL().toString());
		// 错误内容
		logJson.put("error_content", ex.getCause()+"###"+ex.getMessage());
		errorJson.put("request_error", logJson);
		//发送消息到activeMQ
//		messageProducer.sendMessage(mqexception,errorJson);
		threadPoolTaskExecutor.execute(new LogThread(mqexception,errorJson));
		
		JSONObject result = new JSONObject(true);
		result.put("code", businessException.getCode());
		result.put("msg", businessException.getMsg());
		result.put("data", null);
		result.put("exception", businessException.getException());
		return result;
	}
	
	/**
     * 参数绑定异常
     * @param request
     * @param ex
     * @return
     */
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public JSONObject handleBindException(HttpServletRequest request, Exception ex) {
        org.springframework.validation.BindException c = (org.springframework.validation.BindException) ex;
        List<ObjectError> errors = c.getBindingResult().getAllErrors();
        StringBuffer errorMsg = new StringBuffer();
        errors.stream().forEach(x -> errorMsg.append(x.getDefaultMessage()).append(";"));
        log.error(" beanValidator 校验未通过 api:{}, errcode:{}, msg:{}", 
        request.getRequestURI(), 500, errorMsg.toString());
        log.error(" beanValidator 校验未通过  ", ex);
        
		JSONObject errorJson = new JSONObject();
		JSONObject logJson = new JSONObject();
		String LogGlobalKey=request.getHeader("LogGlobalKey");
		logJson.put("log_global_key", LogGlobalKey);
		logJson.put("opt_user", "0000a6acc784464180228eeb1761c48c");
		// 请求时间
		logJson.put("request_time", new Date());
		// 请求URL
		logJson.put("request_url", request.getRequestURL().toString());
		// 错误内容
		logJson.put("error_content", ex.getCause()+"###"+ex.getMessage());
		errorJson.put("request_error", logJson);
		//发送消息到activeMQ
//		messageProducer.sendMessage(mqexception,errorJson);
		threadPoolTaskExecutor.execute(new LogThread(mqexception,errorJson));
		
        JSONObject result = new JSONObject(true);
		result.put("code", 500);
		result.put("msg", errorMsg.toString());
		result.put("data", null);
		result.put("exception", ex.getCause());
        return result;
    }

    /**
     * 未知异常
     * @param request
     * @param ex
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public JSONObject handleException(HttpServletRequest request, Exception ex) {
        log.error("###全局捕获异常###,Exception api:{}, errcode:{}, msg:{}",        
        request.getRequestURI(), 500, "内部错误", ex.getMessage());
        log.error("###全局捕获异常###,Exception ", ex);
        
		JSONObject errorJson = new JSONObject();
		JSONObject logJson = new JSONObject();
		String LogGlobalKey=request.getHeader("LogGlobalKey");
		logJson.put("log_global_key", LogGlobalKey);
		logJson.put("opt_user", "0000a6acc784464180228eeb1761c48c");
		// 请求时间
		logJson.put("request_time", new Date());
		// 请求URL
		logJson.put("request_url", request.getRequestURL().toString());
		// 错误内容
		logJson.put("error_content", ex.getCause()+"###"+ex.getMessage());
		errorJson.put("request_error", logJson);
		//发送消息到activeMQ
//		messageProducer.sendMessage(mqexception,errorJson);
		threadPoolTaskExecutor.execute(new LogThread(mqexception,errorJson));
		
        JSONObject result = new JSONObject(true);
		result.put("code", 500);
		result.put("msg", "系统错误");
		result.put("data", null);
		result.put("exception", ex.getCause());
        return result;
    }
    
    /**
	 * 使用多线程写入日志目的:加快响应 提高程序效率 使用线程池维护线程
	 */
	class LogThread implements Runnable {
		private Queue mq;
		private JSONObject myJson;

		public LogThread(Queue mqexception, JSONObject myJson) {
			this.mq = mqexception;
			this.myJson = myJson;
		}

		@Override
		public void run() {
			log.info(">>>>>aop log error>>>>>step into Asynchronous Thread Call>>>>");
			messageProducer.sendMessage(mq,myJson);
			log.info(">>>>>aop log error>>>>>Asynchronous Thread Call  Over>>>>");
		}
	}
	
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值