java捕获全局异常

java捕获全局异常

  • @ControllerAdvice是一个@Component,用于定义@ExceptionHandler@InitBinder@ModelAttribute方法,适用于所有使用@RequestMapping方法。

  • Spring4之前,@ControllerAdvice在同一调度的Servlet中协助所有控制器。Spring4已经改变:@ControllerAdvice支持配置控制器的子集,而默认的行为仍然可以利用。

  • 在Spring4中, @ControllerAdvice通过annotations()basePackageClasses()basePackages()方法定制用于选择控制器子集。

不过据经验之谈,只有配合@ExceptionHandler最有用,其它两个不常用。

@ControllerAdvice用来处理异常

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 java.util.HashMap;
import java.util.Map;


@ControllerAdvice
public class ControllerAdvice {

	private static final Logger log = LoggerFactory.getLogger(RuleMappingAdapterImpl.class);
	/**
	 * 全局异常捕捉处理
	 * 
	 * @param ex
	 * @return
	 */
	@ResponseBody
	@ExceptionHandler(value = Exception.class)
	public Map<String, Object> errorHandler(Exception ex) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("code", Constant.ExeceptionCode.E_500);
		map.put("msg", ex.getMessage());
		log.error("捕捉到全局异常(Exception),msg:{}", map.get("msg"), ex);
		return map;
	}

	/**
	 * 拦截捕捉自定义异常 MyException.class
	 * 
	 * @param ex
	 * @return
	 */
	@ResponseBody
	@ExceptionHandler(value = CException.class)
	public Map<String, Object> myErrorHandler(CException ex) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("code", ex.getCode());
		map.put("msg", ex.getMsg());
		if(ex.getContext() == null ){
			map.put("class", "");
		}else {
			map.put("class", ex.getContext().getClass().getName());

		}
		log.error("捕捉到全局异常(CntenException),msg:{}", map.get("msg"), ex.getExe());
		return map;
	}
}

public class Constant {
	public static class ExeceptionCode {
		public static int E_500 = 500;// 系统异常
		public static int E_200 = 200;// 正常访问
		public static int E_403 = 403;// 资源无权访问
		public static int E_401 = 401;// 用户验证失败
		/**
		 * 各自模块自己定义
		 */
	}
}

public class CException extends RuntimeException {
	private static final long serialVersionUID = -1433777525759711883L;

	public CException(Object context, String code, String msg) {
		this.code = code;
		this.msg = msg;
		this.context = context;
	}

	public CException(Object context, String code, String msg, Exception exe) {
		this.code = code;
		this.msg = msg;
		this.context = context;
		this.exe = exe;
	}

	private Object context;
	private String code;
	private String msg;
	private Exception exe;

	public Object getContext() {
		return context;
	}

	public void setContext(Object context) {
		this.context = context;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public Exception getExe() {
		return exe;
	}

	public void setExe(Exception exe) {
		this.exe = exe;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/83781890