首页
技术知识库
Task工作计划
网站简介
DON框架
后台管理
文章分类
JAVA
框架知识
操作系统
容器相关
数据库层
优化技术
界面编程
网络编程
开发工具
GO语言
其他
读书随笔
观影随笔
每日随笔
APP
struts2异常处理[Struts2]
所属分类
:[框架知识] |
创建时间
:2013-01-13 |
文章属性
:原创 |
文章来源
:http://windfly.cn |
作者
:windfly
<p>   </p> <p style="margin-bottom: 0in; margin-top: 0in; margin-right: 0in; margin-left: 0in"> <font size="10pt"><span><br> </span></font><font size="18pt" color="#003366"><span><b>一,Struts2的异常处理机制:</b></span></font> </p> <p style="margin-top: 0in; margin-left: 0in; margin-bottom: 0in; margin-right: 0in"> 任何成熟的MVC框架都应该提供成就的异常处理机制。Strut2也不例外。Struts2提供了一种声明式的异常处理方式。Struts2也是通过配置的拦截器来实现异常处理机制的。 </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> <span>Struts2的异常处理机制通过在struts.xml文件中配置﹤exception-mapping ...</span> <span>﹥元素完成的,配置该元素时,需要指定两个属性:</span> </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> exception:此属性指定该异常映射所设置的异常类型。 </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> result:此属性指定Action出现该异常时,系统转入result属性所指向的结果。 </p> <p style="margin-top: 0in; margin-left: 0in; margin-bottom: 0in; margin-right: 0in"> <font size="10pt"><span><br> </span></font><font size="18pt" color="#003366"><span><b>二,异常映射也分为两种:</b></span></font> </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> 局部异常映射:﹤exception-mapping...﹥元素作为﹤action...﹥元素的子元素配置。 </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> 全局异常映射:﹤exception-mapping...﹥元素作为﹤global-exception-mappings﹥元素的子元素配置。 </p> <p style="margin-top: 0in; margin-left: 0in; margin-bottom: 0in; margin-right: 0in"> <font size="10pt"><span><br> </span></font><font size="18pt" color="#003366"><span><b>三, 输出异常信息:</b></span></font> </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> 使用Struts2的标签来输出异常信息: </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> ﹤s:property value="exception.message"/﹥:输出异常对象本身。 </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> ﹤s:property value="exceptionStack"/﹥: 输出异常堆栈信息。 </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> 利用struts2的异常处理机制和拦截器机制可以很方便的实现异常处理功能,你不再需要在Action中捕获异常,并抛出相关的异常了,这些都交给拦截器来帮你做了。 </p> <p style="margin-top: 0in; margin-left: 0in; margin-bottom: 0in; margin-right: 0in"> <font size="10pt"><span><br> </span></font><font size="18pt" color="#003366"><span><b>四,在 struts.xml 文件中,声明全局异常映射,以及对应的全局异常转发如下所示:</b></span></font> </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> <font color="black"><span>﹤global-results﹥<br>﹤result name=</span></font> <font color="#009100"><span>"error"</span></font> <font color="black"><span>﹥/admin/error/ErrDisplay.ftl﹤/result﹥<br>﹤/global-results﹥<br>﹤global-exception-mappings﹥<br>﹤exception-mapping result=</span></font> <font color="#009100"><span>"error"</span></font> <font color="black"><span>exception=</span></font> <font color="#009100"><span>"com.orizone.hbmobile.hbcm.struts.BusinessException"</span></font> <font color="black"><span>﹥﹤/exception-mapping﹥<br>﹤/global-exception-mappings﹥</span></font> </p> <p style="margin-top: 0in; margin-left: 0in; margin-bottom: 0in; margin-right: 0in"> <font size="10pt"><span><br> </span></font><font size="18pt" color="#003366"><span><b>五,BusinessException 是异常处理类,代码如下所示:</b></span></font> </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> <font color="#000091"><span>public</span></font> <font color="black"><span>class BusinessException </span></font><font color="#000091"><span>extends</span></font> <font color="black"><span>RuntimeException<br><br>{<br></span></font><font color="#000091"><span>private</span></font> <font color="#000091"><span>static</span></font> <font color="#000091"><span>final</span></font> <font color="#910091"><span>long</span></font> <font color="black"><span>serialVersionUID = 0xc1a865c45ffdc5f9L;<br></span></font><font color="#000091"><span>public</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#910091"><span>String</span></font> <font color="black"><span>frdMessage)<br></span><span> </span><span> {<br></span><span>    </span></font><font color="#000091"><span>super</span></font> <font color="black"><span>(createFriendlyErrMsg(frdMessage));<br>}<br></span></font><font color="#000091"><span>public</span></font> <font color="black"><span>BusinessException(Throwable throwable)<br></span><span> </span><span> {<br></span><span>   </span></font><font color="#000091"><span>super</span></font> <font color="black"><span>(throwable);<br><br></span><span> </span><span> }<br></span></font><font color="#000091"><span>public</span></font> <font color="black"><span>BusinessException(Throwable throwable, </span></font><font color="#910091"><span>String</span></font> <font color="black"><span>frdMessage)<br>{<br></span><span>     </span></font><font color="#000091"><span>super</span></font> <font color="black"><span>(throwable);<br>}<br></span></font><font color="#000091"><span>private</span></font> <font color="#000091"><span>static</span></font> <font color="#910091"><span>String</span></font> <font color="black"><span>createFriendlyErrMsg(</span></font> <font color="#910091"><span>String</span></font> <font color="black"><span>msgBody){<br><br></span></font><font color="#910091"><span>String</span></font> <font color="black"><span>prefixStr = </span></font><font color="#009100"><span>"抱歉,"</span></font> <font color="black"><span>;<br><br></span></font><font color="#910091"><span>String</span></font> <font color="black"><span>suffixStr = </span></font><font color="#009100"><span>" 请稍后再试或与管理员联系!"</span></font> <font color="black"><span>;<br></span></font><font color="#910091"><span>StringBuffer</span></font> <font color="black"><span>friendlyErrMsg = </span></font><font color="#000091"><span>new</span></font> <font color="#910091"><span>StringBuffer</span></font> <font color="black"><span>("");<br>friendlyErrMsg.append(prefixStr);<br>friendlyErrMsg.append(msgBody);<br>friendlyErrMsg.append(suffixStr);<br></span></font><font color="#000091"><span>return</span></font> <font color="black"><span>friendlyErrMsg.toString();<br><br>}<br><br>}</span></font> </p> <p style="margin-top: 0in; margin-left: 0in; margin-bottom: 0in; margin-right: 0in"> <font size="10pt"><span><br> </span></font><font size="18pt" color="#003366"><span><b>六,/admin/error/ErrDisplay.ftl 页面</b></span></font> </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> 这个页面很简单: </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> <font color="black"><span>﹤body﹥<br>﹤h2﹥<br></span><span>  </span><span>出现异常啦<br>﹤/h2﹥<br>﹤hr/﹥<br>﹤h3 style=</span></font> <font color="#009100"><span>"color:red"</span></font> <font color="black"><span>﹥<br>﹤!-- 获得异常对象 --﹥<br>${exception.message?</span></font> <font color="#000091"><span>default</span></font> <font color="black"><span>("")}<br>﹤/h3﹥<br>﹤br/﹥<br>﹤!-- 异常堆栈信息(开发人员用) --﹥<br>﹤div style=</span></font> <font color="#009100"><span>"display:none;"</span></font> <font color="black"><span>﹥<br></span><span>  </span><span>${exceptionStack?</span></font> <font color="#000091"><span>default</span></font> <font color="black"><span>("")}<br>﹤/div﹥<br>﹤/body﹥</span></font> </p> <p style="margin-top: 0in; margin-left: 0in; margin-bottom: 0in; margin-right: 0in"> <font size="10pt"><span><br> </span></font><font size="18pt" color="#003366"><span><b>六,在拦截器中,捕获常见的异常,并以友好异常信息抛出,相关代码如下所示:</b></span></font> </p> <p style="margin-top: 0in; margin-bottom: 0in; margin-left: 0in; margin-right: 0in"> <font color="#000091"><span>public</span></font> <font color="#910091"><span>String</span></font> <font color="black"><span>intercept(ActionInvocation invocation) </span></font><font color="#000091"><span>throws</span></font> <font color="black"><span>Exception<br><br>{<br><br>before(invocation);<br><br></span></font><font color="#910091"><span>String</span></font> <font color="black"><span>result = "";<br></span></font><font color="#000091"><span>try</span></font> <font color="black"><span>{<br><br>result = invocation.invoke();<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(DataAccessException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"数据库操作失败!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(NullPointerException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"调用了未经初始化的对象或者是不存在的对象!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(IOException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"IO异常!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(ClassNotFoundException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"指定的类不存在!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(ArithmeticException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"数学运算异常!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(ArrayIndexOutOfBoundsException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"数组下标越界!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(IllegalArgumentException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"方法的参数错误!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(ClassCastException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"类型强制转换错误!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(SecurityException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"违背安全原则异常!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(SQLException ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"操作数据库异常!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(NoSuchMethodError ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"方法末找到异常!"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(InternalError ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"Java虚拟机发生了内部错误"</span></font> <font color="black"><span>);<br><br>}</span></font> <font color="#000091"><span>catch</span></font> <font color="black"><span>(Exception ex){<br><br></span></font><font color="#000091"><span>throw</span></font> <font color="#000091"><span>new</span></font> <font color="black"><span>BusinessException(</span></font> <font color="#009100"><span>"程序内部错误,操作失败!"</span></font> <font color="black"><span>);<br><br>}<br>after(invocation, result);<br><br></span></font><font color="#000091"><span>return</span></font> <font color="black"><span>result;<br><br>}</span></font> </p>
返回