一般框架发生异常都是将该异常抛出去(即框架本身没有处理异常的能力)
而我们为了解决异常的处理的难题我们采用的方法是struts2拦截器(以struts2为例)
具体实现:
第一步:定义一个类 继承MethodFilterInterceptor类
第二步:覆盖doIntercept方法
第三步:如果(actioninvocation.invoke();) 改行代码抛出异常。对该异常进行try()catch(){}
第四步:在catch模块中进行日志编写
第五步:在struts.xml中配置
代码实现:
protected String doIntercept(ActionInvocation actioninvocation) throws Exception {
// TODO Auto-generated method stub
//把自定义错误信息 放置到request中
HttpServletRequest request=(HttpServletRequest) actioninvocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
try{
String result=null;
//运行被拦截的Action,期间如果发生异常会被catch
result=actioninvocation.invoke();
return result;
}catch (Exception e) {
/**
* 处理异常
*/
String errorMsg="出现错误信息,请查看日志!";
//通过instanceof 判断到底是什么异常数据类型
if(e instanceof RuntimeException){
//未知的运行异常
RuntimeException re=(RuntimeException)e;
re.printStackTrace();
errorMsg=re.getMessage().trim();
}
/**
* 发送错误消息到页面
*/
request.setAttribute("errorMsg", errorMsg);
/**
*log4j记录日志
*/
Log log=LogFactory.getLog(actioninvocation.getAction().getClass());
log.error("errorMsg",e);
return "errorMsg";
}
}
配置文件中配置(struts2.xml)
<!-- 自定义拦截器,实现异常处理,实现细颗粒权限控制 -->
<interceptors>
<!-- 声明拦截器 -->
<interceptor name="errorAndLimitInerceptor" class="com.xing.elec.utils.errorAndLimitInerceptor"></interceptor>
<!-- 配置拦截器栈 -->
<interceptor-stack name="myErrorAndLimitInterceptor">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="errorAndLimitInerceptor">
<!-- 该行代码 作用 :让自定义的拦截器对一下方法不起拦截作用 -->
<param name="excludeMethods">menuHome,title,left,change,loading,logout,alermStation,alermDevice,showMenu</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 覆盖底层的拦截器栈,对包中所有action都有效 -->
<default-interceptor-ref name="myErrorAndLimitInterceptor"></default-interceptor-ref>
总结:异常处理
1.使用struts2拦截器。
2.在拦截器中的doInterceptor()方法定义try()catch(){}捕获异常
3.如果Action、Service、Dao没有抛出异常,则在try模块中指定正确操作的页面,例如:
result=actioninvocation.invoke();
return result; result为跳转的正确页面
4.如果Action、Service、Dao抛出异常,则在catch模块中,捕获异常,使用log4.j存放到指定的日志文件中,通过return “errorMsg”; 跳转到错误页面