系统出错时写的的拦截器非常经典

package cn.com.css.common.interceptor;

import java.io.IOException;
import java.sql.SQLException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.DataAccessException;

import cn.com.css.common.exception.MSIPSysException;
import cn.com.css.util.SysConstants;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

/**
 * 此类是struts2的拦截器当发生错误时<br/>
 * 由此类进行拦截并调用系统的异常处理类<br/>
 * 生成页面错误信息和打印LOG日志<br/>
 *
 * @version 1.0
 *
 */
@SuppressWarnings("serial")
public class MSIPSysExceptionInterceptor extends AbstractInterceptor {

 //log4j实例名
 private static final Log errorLog = LogFactory.getLog(SysConstants.LOG_ERROR);
 
 //构造方法
 private MSIPSysExceptionInterceptor() {
  
 }

 //初始化realPath只在服务器启动时执行一次
 @Override
 public void init() {
 }

 //主拦截方法,拦截常用的错误异常,当有异常发生时进行捕捉并打印LOG日志和生成页面的错误提示信息
 @Override
 public String intercept(ActionInvocation invocation) throws Exception {
  
  String method=invocation.getProxy().getMethod();
  String nameSpace = invocation.getProxy().getNamespace().substring(invocation.getProxy().getNamespace().lastIndexOf("/")+1);
  String result = "";
  String mes = ""
    + "<br><br>nameSpace:" + invocation.getProxy().getNamespace()
    + "<br>action:" + invocation.getProxy().getAction()
    + "<br>method:" + invocation.getProxy().getMethod()
    + "<br><br>" + "具体的错误信息为:";
  try {
   result = invocation.invoke();
  } catch (DataAccessException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError","数据库操作失败!" );
   throw new MSIPSysException(mes+ ex.getMessage());
  } catch (NullPointerException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError","调用了未经初始化的对象或者是不存在的对象!" );
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (IOException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError","IO异常!" );
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (ClassNotFoundException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError", "指定的类不存在!" );
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (ArithmeticException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError", "数学运算异常!");
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (ArrayIndexOutOfBoundsException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError", "数组下标越界!" );
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (IllegalArgumentException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError", "方法的参数错误!");
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (ClassCastException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError","类型强制转换错误!");
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (SecurityException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError","违背安全原则异常!");
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (SQLException ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError","操作数据库异常!" );
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (NoSuchMethodError ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError","方法末找到异常!" );
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (InternalError ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError","Java虚拟机发生了内部错误" );
   throw new MSIPSysException(mes + ex.getMessage());
  } catch (Exception ex) {
   this.logging(method, nameSpace, ex);
   invocation.getInvocationContext().put("invocationError","程序内部错误,操作失败!" );
   throw new MSIPSysException(mes + ex.getMessage());
  }
  return result;
 }
 
 //打印LOG日志
 private void logging(String method,String nameSpace,Exception ex)
 {
  try {
   errorLog.debug("-------------------"+nameSpace+"提交的method="+method+"---------------\n");
   errorLog.fatal("错误提示:"+ex.getMessage(),ex);
  } catch (Exception e) {
   errorLog.debug("-------------------loggingMeg.xml文件解析错误---------------\n");
   errorLog.fatal("错误提示:"+ex.getMessage(),ex);
  }
 }
 
 //打印LOG日志
 private void logging(String method,String nameSpace,NoSuchMethodError ex)
 {
  try {
   errorLog.debug("-------------------"+nameSpace+"提交的method="+method+"---------------\n");
   errorLog.fatal("错误提示:"+ex.getMessage(),ex);
  } catch (Exception e) {
   errorLog.debug("-------------------loggingMeg.xml文件解析错误---------------\n");
   errorLog.fatal("错误提示:"+ex.getMessage(),ex);
  }
 }
 
 //打印LOG日志
 private void logging(String method,String nameSpace,InternalError ex)
 {
  try {
   errorLog.debug("-------------------"+nameSpace+"提交的method="+method+"---------------\n");
   errorLog.fatal("错误提示:"+ex.getMessage(),ex);
  } catch (Exception e) {
   errorLog.debug("-------------------loggingMeg.xml文件解析错误---------------\n");
   errorLog.fatal("错误提示:"+ex.getMessage(),ex);
  }
 }

}

时间: 2024-09-20 07:49:08

系统出错时写的的拦截器非常经典的相关文章

C#中的backgroundWorker的DoWork出错时,如何让调试器断在出错点?

问题描述 我写的backgroundWorker的DoWork中代码量非常大,功能非常复杂,而且在开发阶段,极有可能会出错的以前用界面线程直接调用时没事,只是会卡死界面,但出错时会正常断在错误处,以便宜我调试,分析,解BUG现在用backgroundWorker后,出错直接就报个Complet就完了,我想分析啊,怎么办?我要调用堆栈,我要量变监控,才能解bug,这样软件怎么才能完善所以,求backgroundWorker线程中直接能出错时断下来的方法,呈现完整的可Debug的状态,放弃backg

Struts2之拦截器篇

拦截器是Struts2框架的核心和基础,Struts2绝大多数功能都是通过拦截器来完成的,当StrutsPrepareAndExecuteFilter拦截到用户请求后,大量拦截器会对该请求进行处理,然后才调用用户自定义的Action类中的方法进行处理请求,由此可见,拦截器是Struts2的核心所在. Struts2框架内建了大量的拦截器,我们可以在struts-default.xml中进行查看: 那么这些内置拦截器的具体作用是什么呢?     alias 实现在不同请求中相似参数别名的转换 au

package-ssh的struts2拦截器拦截请求后页面为什么没有跳转

问题描述 ssh的struts2拦截器拦截请求后页面为什么没有跳转 我在struts.xml里把拦截器添加到了新的拦截器栈,命名了一个package名,然后我在一个子的struts-action-index.xml里继承了这个package做登录验证,并且程序执行时已经进入了拦截器类,并且执行完了类里的代码,返回了Action.Login,为什么通过全局返回处理页面没有跳转到登录页面 <package name=""struts-default-json""

JavaWeb中Struts2拦截器深入分析(一)_java

一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事.过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面向切面)的编程思想,是可插拔的, 可以对访问某个 Action 方法之前或之后实施拦截. 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 在访问被拦截的方法时, Struts2拦截器链中的拦截器就会按其之前定义的顺序被依次调用 Struts2执行原理

spring MVC拦截器01

spring MVC拦截 作用:身份校验,权限检查,防止非法访问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法增加分类,无法删除博文. spring MVC 拦截实现分为2步 (1)编写拦截器类,必须继承org.springframework.web.servlet.HandlerInterceptor 核心方法: public boolean preHandle(HttpServletRequest request, HttpServ

关于Struts2文件上传与自定义拦截器_java

一.访问或添加request/session/application属性 public String scope() throws Exception{   ActionContext ctx = ActionContext.getContext();   ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app   ctx.getSession().put("ses", &q

springmvc的拦截器,怎么设置不拦截的url

问题描述 <!-- 默认首页 --><mvc:view-controller path="/" view-name="redirect:/loginpage" /><!-- 拦截器 --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="

Spring Boot实现一个监听用户请求的拦截器

  项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 项目构建与Spring Boot,Spring Boot实现一个拦截器很容易. Spring Boot的核心启动类继承WebMvcConfigurerAdapter // 增加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestLog()); } /

【SpringMVC】SpringMVC配置拦截器 mvc:exclude-mapping 报错

转载请注明出处http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 今天写SpringMVC的拦截器的时候遇到这样一个错误 Element mvc:exclude-mapping is not allowed here. <!-- SpringMVC拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/user/*"/>