自定义异常-统一记录-拦截器

1.产生异常代码

String a = "a3";
intb = Integer.parseInt(a);

 

2.自定义异常类

继承关系:DataAccessException 继承ServiceExceptioextends RestWebServiceException继承Exception

这样做的好处就是:dao层异常抛DataAccessException 这样service层可以覆盖到(子类的异常)然后在网上抛,到rest层,抛RestWebServiceException (也是可以getservice层异常的)

最后统一由拦截器,拦截所以异常然后统一处理。这样做的好处是可以打印错误的行数-好定位问题。

如果自己try catch了,那么在try内报错只在throw Exception时记录行数,也就是这能记录throw那一行无法定位try里哪一行

publicclass DataAccessException extends ServiceException {
	privatestaticfinallongserialVersionUID = 1L;
	private String retCd; // 异常对应的返回码
	private String msgDes; // 异常对应的描述信息

	public DataAccessException() {
		super();
	}

	public DataAccessException(String message) {
		super(message);
		msgDes = message;
	}

	public DataAccessException(String retCd, String message) {
		super();
		this.retCd = retCd;
		this.msgDes = message;
	}
	public DataAccessException( Throwable throwable) {
		super(throwable);
	}
	public DataAccessException(String message,Throwable throwable) {
		super(message,throwable);
		msgDes = message;
	}
	public DataAccessException(String retCd, String message,Throwable throwable) {
		super(message,throwable);
		this.retCd = retCd;
		this.msgDes = message;
	}

 

publicclass ServiceException extends RestWebServiceException {
	privatestaticfinallongserialVersionUID = 1L;
	private String retCd; // 异常对应的返回码
	private String msgDes; // 异常对应的描述信息
。。。同上

 

publicclass RestWebServiceException extends Exception {
	privatestaticfinallongserialVersionUID = 1L;
	private String retCd; // 异常对应的返回码
	private String msgDes; // 异常对应的描述信息

 

看看,到层和service层,rest层如何处理的

//service层直接抛出异常即可
	publicint addComUser(ComUser user) throwsServiceException{
		return comUserMapper.insert(user);
	}

 

看看拦截器如何实现:
/**
 * 异常拦截器
 * @author:andy
 * @version:1.0
 */
publicclass ErrorInterceptor extends AbstractPhaseInterceptor<Message> {
	Logger logger = LoggerFactory.getLogger(getClass());  
	public ErrorInterceptor(String phase) {
		super(phase);
	}
	public ErrorInterceptor(){  
super(Phase.RECEIVE);  
    } 

	@Override
	publicvoid handleMessage(Message msg) throws Fault {
	}
	//出现错误输出错误信息和栈信息  
publicvoid handleFault(Message message) {  
//可以拦截所以异常除了WebApplicationException
        Exception exeption=message.getContent(Exception.class); 
logger.error(exeption.getMessage(),exeption);//只有logger.xxx("",e);2个参数的可以打印异常详细信息,其他参数的函数都不行
    }  
}

 

//rest层,也是直接抛出异常,不要自己try catch。
@GET
	@Path("/getUserById/{id}")
	public ComUser getComUserById(@PathParam("id") intid) throws RestWebServiceException{
		ComUser user = null;
		user = comUserService.getComUserById(id);
		//业务返回
		if(null == user){
			ResponseBuilder builder = Response.status(Status.BAD_REQUEST);
			builder.type(MediaType.APPLICATION_JSON);
			builder.entity(new ResultJson(ResultJson.FAILURE,"访问数据不存在"));
			thrownew WebApplicationException(builder.build());
		}
		
		return user;
	}

 

猜你喜欢

转载自anhongyang125.iteye.com/blog/2342083