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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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 or

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);
  }
 }

}

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7月前
|
缓存 前端开发 Java
保卫你的应用:探索过滤器和拦截器的奥秘
保卫你的应用:探索过滤器和拦截器的奥秘
52 0
|
5月前
|
负载均衡 Java API
通用快照方案问题之Feign添加请求拦截器如何解决
通用快照方案问题之Feign添加请求拦截器如何解决
36 1
|
7月前
|
前端开发 小程序
异常处理器与拦截器 深入探究 --拦截器状态码无法被识别
异常处理器与拦截器 深入探究 --拦截器状态码无法被识别
|
7月前
|
Java
Java异常处理:解释一下异常的传播机制。
Java异常处理:解释一下异常的传播机制。
120 1
|
7月前
|
安全 前端开发 Java
针对 SpringSecurity 鉴权流程做了一个详细分析,让你明白它是如何执行的!
针对 SpringSecurity 鉴权流程做了一个详细分析,让你明白它是如何执行的!
306 0
能否解释授权状态如何影响请求处理?
授权状态对请求处理的影响主要体现在对请求的权限验证上。当一个请求发送到淘宝开放平台时,平台会首先验证该请求的授权状态。如果授权状态为true,表示当前授权有效,请求可以继续处理;如果授权状态为false,表示当前授权无效,请求将被拒绝处理。
|
开发框架 前端开发 NoSQL
限流的非常规用途 - 解决重复提交问题
限流的非常规用途 - 解决重复提交问题
82 0
|
Java Spring
Spring事务原理二(事务拦截逻辑)(上)
Spring事务原理二(事务拦截逻辑)
107 0
|
前端开发
搞明白axios 源码,探究配置、拦截器、适配器等核心功能具体的执行过程(二)
搞明白axios 源码,探究配置、拦截器、适配器等核心功能具体的执行过程(二)
搞明白axios 源码,探究配置、拦截器、适配器等核心功能具体的执行过程(二)
|
JSON API 数据格式
利用注解 + 反射消除重复代码,妙
利用注解 + 反射消除重复代码,妙
105 0