项目中才有第二种异常处理方式,我的比较推荐第二种和第三种实现方式。web
2. 使用SimpleMappingExceptionResolver实现异常处理 spring
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> mvc
<!-- 定义默认的异常处理页面,当该异常类型的注册时使用 --> app
<property name="defaultErrorView" value="error"></property> url
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception --> spa
<property name="exceptionAttribute" value="ex"></property> xml
<!-- 定义须要特殊处理的异常,用类名或彻底路径名做为key,异常也页名做为值 --> 对象
<property name="exceptionMappings"> 继承
<props> 接口
<prop key="cn.basttg.core.exception.BusinessException">error-business</prop>
<prop key="cn.basttg.core.exception.ParameterException">error-parameter</prop>
<!-- 这里还能够继续扩展对不一样异常类型的处理 -->
</props>
</property>
</bean>
3. 实现HandlerExceptionResolver 接口自定义异常处理器
public class EmvcExceptionHandler implements HandlerExceptionResolver {
private static Log log = LogFactory.getLog(EmvcExceptionHandler.class);
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) {
String rurl = request.getServletPath();
ModelAndView model = new ModelAndView();
if (rurl.lastIndexOf(".do") > 0)
model.setViewName("/commons/error/error");
else {
model.setViewName("/error");
}
//访问url
String url = request.getServletPath();
//访问的参数
Enumeration enu = request.getParameterNames();
StringBuffer params = new StringBuffer();
while (enu.hasMoreElements()) {
String paraName = (String) enu.nextElement();
params.append(paraName + "=" + request.getParameter(paraName));
}
//描述信息
String message = exception.getMessage();
//异常类型
String exceptionType = exception.getClass().getName();
//异常位置
String position = null;
ByteArrayOutputStream stackTrace = new ByteArrayOutputStream();
exception.printStackTrace(new PrintStream(stackTrace));
String content = stackTrace.toString();
Pattern pat = Pattern.compile("com(.*)\\)");
Matcher mat = pat.matcher(content);
boolean rs = mat.find();
if (rs) {
position = mat.group(1);
}
position = "com"+position+")";
XaskContext.getSystemData().saveExceptionLog(Arrays.asList(new ExceptionLog(url,params.toString(),message,exceptionType,position,new Date())));
if ((exception instanceof XaskException)) {
model.addObject("errorMsg", exception.getMessage());
log.error(exception.getMessage());
return model;
}
model.addObject("errorMsg", exception.getMessage());
model.addObject("ex", exception);
log.error("未处理异常", exception);
return model;
}
}
<bean id="exceptionHandler" class="cn.basttg.core.exception.MyExceptionHandler"/>
4. 使用@ExceptionHandler注解实现异常处理
@ExceptionHandler
public String exp(HttpServletRequest request, Exception ex) {
System.out.println("异常捕捉||||||"+ex.getClass() + " ||||||====== " +ex.getMessage());
request.setAttribute("ex", ex);
// 根据不一样错误转向不一样页面
if (ex instanceof ParameterException) {
return "error-parameter";
} else {
return "error";
}
}