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

来源:互联网 发布:java同名包类加载顺序 编辑:程序博客网 时间:2024/06/06 07:24

在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);@Overridepublic 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);@Overridepublic 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 blocke.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);@Overridepublic ModelAndView handlerException(HttpServletRequest request,HttpServletResponse response, Object arg, Throwable tb) {logger.error("request format error!");return null;}}


0 0
原创粉丝点击