package cn.nuohy.utils.exception;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.Date;
import javax.persistence.PersistenceException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.exception.ConstraintViolationException;
import org.hibernate.exception.GenericJDBCException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.orm.hibernate3.HibernateJdbcException;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import cn.nuohy.utils.JsonParse;
import com.ibm.icu.text.SimpleDateFormat;
/**
* 异常 工具类
* @author yangnuo
*
*/
public class ExceptionHandler implements HandlerExceptionResolver {
public static final String AJAX_ACCEPT_CONTENT_TYPE = "text/html;type=ajax";
public static final String AJAX_SOURCE_PARAM = "ajaxSource";
//定义一个全局的记录器,通过LoggerFactory获取
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandler.class);
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
StringBuffer errormsg = new StringBuffer("");
ModelAndView modelAndView = new ModelAndView();
System.out.println("异常类:"+ex.getClass());
Throwable cause = ex.getCause();
// System.out.println("cause.getClass()"+cause.getClass());
ex.printStackTrace();
// 根据不同的异常返回错误。
if(ex.getClass().equals(PersistenceException.class) || ex.getClass().equals(DataIntegrityViolationException.class) || ex.getClass().equals(HibernateJdbcException.class)){
if(cause.getClass().equals(ConstraintViolationException.class)){
System.out.println("发生PersistenceException异常");
errormsg.append("发生PersistenceException异常");
errormsg.append("[错误原因:" + ((org.hibernate.exception.ConstraintViolationException)cause).getSQLException().getMessage() + "]");
}else if(cause.getClass().equals(GenericJDBCException.class)){
System.out.println("发生GenericJDBCException异常");
errormsg.append("发生GenericJDBCException异常");
errormsg.append("[错误原因:" + ((org.hibernate.exception.GenericJDBCException)cause).getSQLException().getMessage() + "]");
}
}else if(ex.getClass().equals(DataAccessException.class)){
System.out.println("发生DataAccessException异常");
errormsg.append("发生DataAccessException异常");
errormsg.append("[错误原因:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(NullPointerException.class)){
System.out.println("调用了未经初始化的对象或者是不存在的对象!");
errormsg.append("调用了未经初始化的对象或者是不存在的对象!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(IOException.class)){
System.out.println("IO异常!");
errormsg.append("IO异常!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(ClassNotFoundException.class)){
System.out.println("指定的类不存在!");
errormsg.append("指定的类不存在!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(ArithmeticException.class)){
System.out.println("数学运算异常!");
errormsg.append("数学运算异常!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(ArrayIndexOutOfBoundsException.class)){
System.out.println("数组下标越界!");
errormsg.append("数组下标越界!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(IllegalArgumentException.class)){
System.out.println("方法的参数错误!");
errormsg.append("方法的参数错误!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(ClassCastException.class)){
System.out.println("类型强制转换错误!");
errormsg.append("类型强制转换错误!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(SecurityException.class)){
System.out.println("违背了安全原则!");
errormsg.append("违背了安全原则!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(SQLException.class)){
System.out.println("操作数据库异常!");
errormsg.append("操作数据库异常!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(NoSuchMethodError.class)){
System.out.println("方法末找到异常!");
errormsg.append("方法末找到异常!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else if(ex.getClass().equals(InternalError.class)){
System.out.println("Java虚拟机发生了内部错误!");
errormsg.append("Java虚拟机发生了内部错误!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}else{
System.out.println("未知异常!");
errormsg.append("未知异常!");
errormsg.append("[错误信息:" + ex.getMessage() + "]");
}
logger.error(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+" "+errormsg);
modelAndView.addObject("ex", new Exception(errormsg+""));
modelAndView.setViewName("exception/error");
return modelAndView;
}
/**
* 判断是否为ajax请求
* @param request
* @param response
* @return
*/
protected boolean isAjaxRequestInternal(HttpServletRequest request, HttpServletResponse response) {
String acceptHeader = request.getHeader("Accept");
String ajaxParam = request.getParameter(AJAX_SOURCE_PARAM);
if (AJAX_ACCEPT_CONTENT_TYPE.equals(acceptHeader) || StringUtils.hasText(ajaxParam)) {
return true;
} else {
return false;
}
}
/**
* 输出HTML脚本带格式
*/
protected void writeJson(HttpServletResponse response, Object obj, String charset) {
String json = JsonParse.getJson(obj);
response.setContentType("text/html;charset=" + charset);
response.setDateHeader("Expires", -10);
PrintWriter out = null;
try {
out = response.getWriter();
out.println(json);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null)
out.close();
}
}
}