HTTP网络连接相关知识整理(六):分发处理根异常
2016-04-27 16:34
603 查看
在java中获取到一个exception后有时需要获取该异常的根异常,实现方法有多重,本文介绍两种方式:一种是逐一判断该异常属于哪一个异常的实例,另一个是遍历找到最终抛出异常的类型。
java中可以使用instanceof判断该对象是否是某一个类的实例,通过该方法可以判断异常的类型并调用相应的处理方法。
demo如下,在Java web中使用instanceof判断异常类型并调用不同的方法进行处理
[java] view
plain copy
print?
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;
}
}
通过判断异常的getCause是否为空判断是否为最终的异常抛出类。
参考如下demo,java web(配置略,如需查看配置方法请参考http://blog.csdn.net/smilefyx/article/details/49420555)中实现异常捕获并根据最终的异常类型通过反射机制调用异常类型+Handler的类的handlerException方法进行处理进行异常处理。
[java] view
plain copy
print?
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;
}
}
异常处理类实现如下接口方便通过反射调用到处理方法:
[java] view
plain copy
print?
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时被反射调用。
[java] view
plain copy
print?
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;
}
}
转载原文出处http://blog.csdn.net/smilefyx
1、判断异常实例类型
java中可以使用instanceof判断该对象是否是某一个类的实例,通过该方法可以判断异常的类型并调用相应的处理方法。demo如下,在Java web中使用instanceof判断异常类型并调用不同的方法进行处理
[java] view
plain copy
print?
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方法进行处理进行异常处理。
[java] view
plain copy
print?
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;
}
}
异常处理类实现如下接口方便通过反射调用到处理方法:
[java] view
plain copy
print?
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时被反射调用。
[java] view
plain copy
print?
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;
}
}
转载原文出处http://blog.csdn.net/smilefyx
相关文章推荐
- 如何优雅地处理前端异常?
- C#异常处理详解
- 轻松学习C#的异常处理
- PHP异常处理Exception类
- JS异常处理的一个想法(sofish)
- PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
- PHP如何抛出异常处理错误
- PHP中的错误处理、异常处理机制分析
- js中的异常处理try...catch使用介绍
- php5编程中的异常处理详细方法介绍
- php异常处理使用示例
- Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
- javascript 异常处理使用总结
- java多线程中的异常处理机制简析
- 深入理解Java编程中异常处理的优劣
- 分享一个php 的异常处理程序
- 简单了解Java编程中对异常处理的运用
- 深入剖析Java中的各种异常处理方式
- JS中的异常处理方法分享
- 一些.NET对多线程异常处理技巧分享