当一个Action类抛出一个异常时,Struts2采用声明式的策略即异常映射匹配来处理异常。核心处理思想就是都某个Action的方法执行时抛出异常对象,该异常对象可以被Struts2的异常拦截器自动捕获,并映射到预定义结果视图;由于在struts-default.xml中已经激活异常映射功能,所以作为开发者而言,要做的仅仅是定义异常映射到指定的结果集;

当异常发生时,拦截器会以检查局部异常然后全局异常的顺序,检查所有可以应用于当前Action的异常映射,在所有抛出和声明的异常中寻找与抛出异常对象最接近的异常类型,如果类型匹配,则执行对应的结果,跳转到结果对应页面;

看下面一个简单的例子:

package com.ognl.action;import com.opensymphony.xwork2.ActionSupport;public class ExceptionAction extends ActionSupport {@Overridepublic String execute() throws Exception {int a = 1 / 0;return SUCCESS;}
}

然后看struts.xml配置

 <global-results><result name="ArithmeticException">/exception.jsp</result></global-results><global-exception-mappings><exception-mapping result="ArithmeticException"    exception="java.lang.ArithmeticException"/></global-exception-mappings><action name="exception" class="com.ognl.action.ExceptionAction"><result name="success">/hello.jsp</result></action>

当执行ExceptionAction的execute方法时,会抛出ArithmeticException异常,于是首先回到Action内部,去寻找是否有匹配的异常映射,没有找到后接着去全局异常映射中寻找匹配项,找到后然后跳转到对应的异常页面;

再看一个稍微绕一点的例子:

<global-results><result name="login" type="redirect">/Login.action</result><result name="Exception">/Exception.jsp</result>
</global-results><global-exception-mappings><exception-mapping exception="java.sql.SQLException" result="SQLException"/><exception-mapping exception="java.lang.Exception" result="Exception"/>
</global-exception-mappings>
...
<action name="DataAccess" class="com.company.DataAccess"><exception-mapping exception="com.company.SecurityException" result="login"/><result name="SQLException" type="chain">SQLExceptionAction</result><result>/DataAccess.jsp</result>
</action>

以上配置信息我们可以得出:

1、一个java.sql.SQLException将要链到SQLExceptionAction

2、一个com.company.SecurityException 将要重定向到Login.action

3、其它异常将会请求转发到Exception.jsp页面

如果要在异常页面显示错误信息,该如何显示呢?

一般来说,ExceptionmappingInterceptor 将下列信息添加到ActionContext的Value Stack中

exception 异常对象本身
exceptionStack 栈轨迹详细信息

既然如此,我们就可以通过OGNL的方式会获取它

<h2>An unexpected error has occurred</h2>
<p>Please report this error to your system administrator orappropriate technical support personnel. Thank you for yourcooperation.</p>
<hr />
<h3>Error Message</h3>
<s:actionerror />
<p><s:property value="%{exception.message}" />
</p>
<hr />
<h3>Technical Details</h3>
<p><s:property value="%{exceptionStack}" />
</p>

Struts2这种声明似的异常处理方式,在Hibernate也较为常见,该处理方式简洁明了,关键在于如何弄懂它的核心处理规则,以后即使在复杂的异常处理也不怕!

Struts2之异常机制相关推荐

  1. Python培训教程分享:Python异常机制

    ​ 在学习Python技术的时候,我们经常会遇到一些异常,例如导致程序在运行过程中出现的中断或退出,我们都称之为异常,大多数的异常都不会被程序处理,而是以错误信息的形式展现出来.本期Python培训教 ...

  2. Java异常之异常机制

    2019独角兽企业重金招聘Python工程师标准>>> Java异常处理机制依赖5个关键字try,catch,finally,throw,throws.try关键字后跟着可能出现异常 ...

  3. C# Note34: 异常机制相关小点

    1.使用throw和throw ex抛出异常的区别 通常,我们使用try/catch/finally语句块来捕获异常,那么在抛出异常的时候,使用throw和throw ex有什么区别呢? 假如,按顺序 ...

  4. java的异常机制面试题(转)

    java的异常机制面试题(转) 参考文章: (1)java的异常机制面试题(转) (2)https://www.cnblogs.com/ffaiss/p/11434639.html 备忘一下.

  5. Java异常机制及异常处理建议

    Java异常机制及异常处理建议 参考文章: (1)Java异常机制及异常处理建议 (2)https://www.cnblogs.com/wangxilei/p/9522259.html 备忘一下.

  6. C++ 异常机制分析

    C++ 异常机制分析 参考文章: (1)C++ 异常机制分析 (2)https://www.cnblogs.com/QG-whz/p/5136883.html 备忘一下.

  7. 全面理解java异常机制

    在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大牛,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...

  8. Java异常处理及异常机制介绍

    Java异常处理及异常机制介绍 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. JAVA中用2种方法处理异常: 1.在发生异 ...

  9. Java的知识点19——异常机制Exception

    异常(Exception)的概念 异常指程序运行过程中出现的非正常现象,例如用户输入错误.除数为零.需要处理的文件不存在.数组下标越界等. Java是采用面向对象的方式来处理异常的.处理过程: 1.  ...

最新文章

  1. 模生物嗅觉的神经算法,能让电脑芯片识别气味
  2. Java日志框架Slf4j+Log4j入门
  3. 8.8-9 fsck、dd
  4. 从根本上了解异步编程体系
  5. 创建一个最简单的imgui测试用例
  6. .net core 杂记:用Autofac替换内置容器
  7. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
  8. 合成创意海报灵感|比技术更重要的是创意!
  9. ORACLE 语句关联统计
  10. 特征向量的辨析(数学,机器学习)
  11. [转]对当前自然语言处理方法论中的一个疑惑
  12. IT餐馆—第一回 前言
  13. spring mvc国际化_Spring MVC国际化(i18n)和本地化(L10n)示例
  14. 下岗工人到达退休年龄,养老保险未缴纳满15年,补缴合适吗?
  15. 传智播客java学习之面向对象(抽象类) , 接口
  16. 抢红包插件实现原理浅析
  17. 实现支付代付批量转账接口
  18. Abaqus有限元分析软件介绍
  19. Semantic Proximity Search on Heterogeneous Graph by Proximity Embedding
  20. 简述c++语言的特点(优点)

热门文章

  1. jQuery实现 div里面的文字如何自动缩小,避免文字溢出
  2. 7-2 jmu-Java-02基本语法-05-浮点数的精确计算 (1 分)
  3. 查找链表中倒数第k个结点(C++)
  4. java项目分页_Java项目实战分页类
  5. java程序员的日常_Java程序员的日常——经验贴(纯干货)
  6. as3中splice和slice的用法
  7. Linux下open函数、read函数、write函数记录
  8. 项目部署到weblogic后页面乱码问题
  9. 602. Friend Requests II: Who Has Most Friend?
  10. linux输入子系统