项目总结(二、统一异常处理)

二、统一异常处理

我们知道项目如果采用分层结构的话,异常需要一层层往上抛,直至到action层,然后在action处理异常,提示友好的异常信息给用户。如果在action的每个方法中都用try{}catch处理,那么类似的代码会很多,且如果需要在异常处理时新增一些逻辑,则需要更改的地方很多,工作量大,不易于维护。于是项目打算采用struts的拦截器机制,实现统一异常处理。

1、struts配置文件

首先自定义拦截器栈,配置如下:

<!-- 自定义拦截器栈 -->

<interceptors>

<interceptor name="defaultExceptionInterceptor" class="xxx.DefaultExceptionInterceptor" />

<interceptor-stack name="systemDefaultStack">

<interceptor-ref name="defaultStack" />

<interceptor-ref name="defaultExceptionInterceptor" />

</interceptor-stack>

</interceptors>

<!-- 引用默认的拦截器栈 -->

<default-interceptor-ref name="systemDefaultStack" />

2、自定义枚举类(在需要被拦截的方法中加入)

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ExceptionMeta {

public EOperStatus resultCode() default EOperStatus.FAILURE;

public String message();

}

3、拦截器类(暂时只对ajax请求进行处理)

public class DefaultExceptionInterceptor extends AbstractInterceptor {

private static final long serialVersionUID = -1409945647583201366L;

private final static Logger logger = Logger.getLogger(DefaultExceptionInterceptor.class);

@Override

public String intercept(ActionInvocation invocation) throws Exception {

String result = "";

try {

result = invocation.invoke();

} catch(Exception e) {

logger.error(e.getMessage(), e);

// 异常处理

ActionContext actionContext = invocation.getInvocationContext();

HttpServletRequest request = (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);

// 判断是否是ajax请求

if(this.isAjaxRequest(request)) {

// 获取请求action类

Class<?> clazz = invocation.getAction().getClass();

// 获取请求action对应的方法名

String methodName = invocation.getProxy().getMethod();

// 从缓存中查找异常对象是否已存在,若存在,则直接返回,否则将异常对象加入缓存中

ExceptionMeta exceptionMeta = this.putIfAbsent(clazz, methodName);

if(exceptionMeta != null) {

// 将异常错误码和异常消息添加到map中

Map<String, Object> operateMap = new HashMap<String, Object>(2);

operateMap.put("resultCode", exceptionMeta.resultCode().id());

operateMap.put("message", exceptionMeta.message());

// 将map放入值栈,然后在xml中将map数据以json格式返回给前台

ValueStack stack = invocation.getStack();

stack.set("operateMap", operateMap);

}

result = "ajaxException";

}

}

return result;

}

/**

* 判断缓存中是否有指定key对应的ExceptionMeta对象,如果有,直接取出缓存中的数据,否则将ExceptionMeta对象加入缓存中

* @param clazz action的class

* @param methodName action对应的方法名

* @return ExceptionMeta

* @throws Exception 异常

*/

private ExceptionMeta putIfAbsent(Class<?> clazz, String methodName) {

try {

String exceptionKey = clazz.getName() + "." + methodName;

ExceptionMeta exceptionMeta = ExceptionCache.get(exceptionKey);

if(exceptionMeta == null) {

Method method = clazz.getMethod(methodName);

if(method != null) {

exceptionMeta = method.getAnnotation(ExceptionMeta.class);

ExceptionCache.put(exceptionKey, exceptionMeta);

}

}

return exceptionMeta;

} catch(Exception e) {}

return null;

}

/**

* 判断请求是否是ajax请求

* @param request HttpServletRequest

* @return true or false

*/

private boolean isAjaxRequest(HttpServletRequest request) {

String header = request.getHeader("X-Requested-With");

if(header != null && "XMLHttpRequest".equals(header)) {

return true;

}

return false;

}

}

4、action方法

@ExceptionMeta(resultCode = EOperStatus.FAILURE, message = "xxx")

public String post() throws Exception {

。。。

}

其中resultCode表示错误码,message为自定义的错误消息,用于提示给用户。

时间: 2024-10-16 15:19:13

项目总结(二、统一异常处理)的相关文章

SpringBoot项目如何做到统一异常处理

在项目中,难免会出现各种各样的异常,我们希望异常信息尽可能详细,包括响应状态码,响应的字符串异常信息,甚至操作时间等等,这样可以方便地快速定位到发生异常的位置.所以,一个项目中对于异常的处理就显得尤为重要.那么,小编就以SpringBoot框架,通过代码实例展示统一异常的处理方式. 1.首先我们简单搭建一个SpringBoot框架的项目,项目名称是exceptionhandler(异常处理) 2.导入相关依赖 导入lombok依赖,提供@getter注解 导入日期工具类JodaTime,提供Da

Java 服务器项目风格推荐 - 统一异常处理

1.介绍 统一的异常处理有两方面的作用,第一是帮助我们将异常保存,以便后续处理,另一方面,同意一场处理是作为响应的一部分,快速的响应给用户处理结果 2.使用 我是用的是 SpringBoot 框架,框架自带了异常处理的方法,我只需要添加自己的异常处理函数就行,同时,配合上一章介绍的统一响应是异常处理更加完善. @ControllerAdvice public class ExceptionControllerAdvice { /** * 捕获参数异常 * * @param e 异常请求 * @p

js构建ui的统一异常处理方案(二)

上一篇文章,我分析了同步代码做异常处理是基于责任链模式,而通过try.catch等语句可以很容易地实现这种责任链模式.但是如果是异步调用,我们无法直接通过try.catch语句实现责任链模式,并且通过一个demo证明使用回调函数的方式去实现去实现异常处理的责任链模式是非常繁琐而且代码难以规范的,适用性不高.有没有什么方式能够使得异步js的责任链模式能够更加简单地实现呢? 对于这个问题,我们还是先回到js异步调用上,随着node和npm的普及,js异步调用也越来越被大家重视,于是乎npm引用了一个

011医疗项目-模块一:统一异常处理

010中提到了serivce层抛出异常,然后由Action层去捕获异常去处理,之前的写法是很繁琐的,所以我们这里统一异常处理. Java中进行异常处理: 一类是可预知的异常,程序员在编码时,主动抛出的异常,为了给用户操作提示,提前检查代码中可能存在异常. 通过开发中,采用自定义的异常类,每个异常类表示每一类异常信息.类需要继承Exception类. 本系统采用统一异常类,提供一个属性标识异常类. 另一类是不可预知异常,就是runtimeException异常,通过提高代码编写质量来避免此类异常,

spring boot 1.5.4 统一异常处理(九)

上一篇:springboot 1.5.4 配置文件详解(八) 1      Spring Boot统一异常处理 Spring Boot中实现了默认的error映射,但是在实际应用中,上面你的错误页面对用户来说并不够友好,我们通常需要去实现我们自己的异常提示. 以springboot项目为例,进行处理! springboot项目源码: https://git.oschina.net/wyait/springboot1.5.4.git 1.1  创建全局异常处理类 通过使用@ControllerAd

error.jsp错误页面跳转,统一异常处理

常见web项目中会用倒计时然后跳转页面来处理异常 error.jsp关键代码: <script language="javascript" type="text/javascript"> var timer; //启动跳转的定时器 function startTimes() { timer = window.setInterval(showSecondes,1000); } var i = 5; function showSecondes() { if

springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解.请求乱码解决.统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制.登录判断重定向.session时间设置 springboot + shiro 动态更新用户信息 基于前篇,新增功能: 新增shiro权限注解: 请求乱码问题解决: 统一异常处理. 源码已集成到项目中: github源码: https://githu

Spring中的统一异常处理方式

源自:https://segmentfault.com/a/1190000016236188 在具体的SSM项目开发中,由于Controller层为处于请求处理的最顶层,再往上就是框架代码的. 因此,肯定需要在Controller捕获所有异常,并且做适当处理,返回给前端一个友好的错误码. 不过,Controller一多,我们发现每个Controller里都有大量重复的.冗余的异常处理代码,很是啰嗦.能否将这些重复的部分抽取出来,这样保证Controller层更专注于业务逻辑的处理,同时能够使得异

使用Spring MVC统一异常处理实战

1 描写叙述 在J2EE项目的开发中.无论是对底层的数据库操作过程.还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常须要处理.每一个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一.维护的工作量也非常大. 那么,能不能将全部类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的. 以下将介绍使用Spring MVC统一处理异常的解决和实现过程. 2 分析 Spring MVC处理异