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
- java中获取根异常并进行分发处理
- C语言获取文件中单词并进行处理
- java如何进行异常处理
- Java如何进行异常处理
- Java中异常处理
- Java中异常处理
- java中异常处理
- java中异常处理
- Java中异常处理
- Java中异常处理
- java中处理异常
- java中异常处理
- 如何在Application中进行异常处理
- JAVA语言如何进行异常处理
- JAVA语言如何进行异常处理
- JAVA语言如何进行异常处理?
- java 是如何进行异常处理的
- java进行异常处理时的注意事项
- maven项目打包
- 总结oninput、onchange与onpropertychange事件的用法和区别
- MFC DestroyWindow、OnDestroy、OnClose 程序关闭相关
- Android WebView中JAVA与JS之间的传递(一)
- 中断与异常详解(二)
- java中获取根异常并进行分发处理
- 【LeetCode从零单刷】Kth Smallest Element in a BST
- C语言整理-11
- eclipse背景颜色修改插件color theme
- 一步一步学习Python(使用bat快捷启动)
- net大型分布式电子商务架构说明
- MessageQueue, Looper, Thread, Handler, Message, Messenger
- Spring简介
- LeetCode 70: Climbing Stairs