java中获取根异常并进行分发处理

在java中获取到一个exception后有时需要获取该异常的根异常,实现方法有多重,本文介绍两种方式:一种是逐一判断该异常属于哪一个异常的实例,另一个是遍历找到最终抛出异常的类型。


1、判断异常实例类型

java中可以使用instanceof判断该对象是否是某一个类的实例,通过该方法可以判断异常的类型并调用相应的处理方法。

demo如下,在Java web中使用instanceof判断异常类型并调用不同的方法进行处理

package com.landsem.update.base.exception.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import com.landsem.update.base.exception.ActionUnSupportException;

public class ExceptionDispatcher implements HandlerExceptionResolver {
	protected static Logger logger = Logger.getLogger(ExceptionDispatcher.class);

	@Override
	public ModelAndView resolveException(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3) {

		//action unSupport exception.自定义的异常
		if (arg3 instanceof ActionUnSupportException) {
			logger.error("ActionUnSupportException exception.");
			arg3.printStackTrace();
		}
		//DataIntegrityViolationException exception.数据库抛出的异常
		else if (arg3 instanceof DataIntegrityViolationException) {
			logger.error("DataIntegrityViolationException");
			arg3.printStackTrace();
		}
		//base exception.根异常
		else if (arg3 instanceof Exception) {
			logger.error("unknown exception.");
			arg3.printStackTrace();
		}
		return null;
	}

}

2、遍历获取根异常并通过反射机制调用处理方法

通过判断异常的getCause是否为空判断是否为最终的异常抛出类。

     参考如下demo,java web(配置略,如需查看配置方法请参考http://blog.csdn.net/smilefyx/article/details/49420555)中实现异常捕获并根据最终的异常类型通过反射机制调用异常类型+Handler的类的handlerException方法进行处理进行异常处理。

package com.landsem.update.base.exception.handler;

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

public class ExceptionDispatcher implements HandlerExceptionResolver {
	protected static Logger logger = Logger
			.getLogger(ExceptionDispatcher.class);

	@Override
	public ModelAndView resolveException(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3) {
		//
		if (null != arg3) {
			Throwable tb = findRootExceptionThrowable(arg3);
			if (null != tb) {
				String basePackageName = this.getClass().getPackage().getName();
				String exceptionBaseName = tb.getClass().getName();
				String handlerClassName = new StringBuffer()
						.append(basePackageName)
						.append(exceptionBaseName.substring(exceptionBaseName
								.lastIndexOf("."))).append("Handler").toString();
				logger.info(handlerClassName);
				try {
					Class<?> cls = Class.forName(handlerClassName);
					if (null != cls) {
						Method m = cls.getDeclaredMethod("handlerException",
								new Class[] { HttpServletRequest.class,
										HttpServletResponse.class, Object.class,
										Throwable.class });
						if (null != m) {
							return (ModelAndView) m.invoke(cls.newInstance(), arg0,
									arg1, arg2, tb);
						}
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return null;
	}

	/**
	 * find root exception throwable.
	 * 
	 * @param e
	 * @return
	 */
	protected Throwable findRootExceptionThrowable(Exception e) {
		/*
		 * Throwable tmp = e.getCause(); while (null != tmp &&
		 * !(tmp.getClass().getName().equals(tmp.getCause().getClass()
		 * .getName()))) { tmp = tmp.getCause(); } return tmp;
		 */
		Throwable rootCause = e;

		while (rootCause.getCause() != null) {
			rootCause = rootCause.getCause();
		}
		return rootCause;
	}

}

异常处理类实现如下接口方便通过反射调用到处理方法:

package com.landsem.update.base.exception.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;

public interface IExceptionHandler {
	public ModelAndView handlerException(HttpServletRequest request,
			HttpServletResponse response, Object arg,Throwable tb);
}

如下为一个简单的ParamsFormatErrorExceptionHandler实现,当抛出自定义异常ParamsFormatErrorException时被反射调用。

package com.landsem.update.base.exception.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;

public class ParamsFormatErrorExceptionHandler implements IExceptionHandler{
	protected static Logger logger = Logger
			.getLogger(ExceptionDispatcher.class);	

	@Override
	public ModelAndView handlerException(HttpServletRequest request,
			HttpServletResponse response, Object arg, Throwable tb) {
		logger.error("request format error!");
		return null;
	}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值