`

Struts2 BusinessException

阅读更多
最近更新STRUTS的版本到2.1.8 ,发现异常发生后,没有收到异常邮件了,
配置

<global-exception-mappings>  
            <exception-mapping result="normalException"  
                exception="com.esc.common.exception.BusinessException">  
            </exception-mapping>  
        </global-exception-mappings> 


BusinessException继承了RuntimeExcption,2.0的时候,凡是非BusinessException子类,就会向外抛出,那么就能在我下面的catch块中捕获到异常
代码

//我的filter,在struts的filter之前  
public void doFilter(ServletRequest org0, ServletResponse org1,  
            FilterChain chain) throws IOException, ServletException {  
        HttpServletRequest request = (HttpServletRequest) org0;  
        HttpServletResponse response = (HttpServletResponse) org1;  
        try {  
            ..........  
            chain.doFilter(org0, org1);//到STRUTS的FILTER  
            ..........  
        }catch (Exception e) {//现在这里现在永远到不了  
            sendEmailIfNecessary(e, request);//发邮件  
        }  


查了很久,发现此版本不再抛异常了,org.apache.struts2.dispatcher.Dispatcher类serviceAction方法代码

public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context,  
                             ActionMapping mapping) throws ServletException {  
  
       .......;  
       try {  
           ......;  
       } catch (ConfigurationException e) {//异常处理  
        // WW-2874 Only log error if in devMode  
        if(devMode) {  
            LOG.error("Could not find action or result", e);  
        }  
        else {  
            LOG.warn("Could not find action or result", e);  
        }  
           sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e);  
       } catch (Exception e) {  
           //这里以前是throw new ServletException(e);  
           sendError(request, response, context, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);  
       } finally {  
           UtilTimerStack.pop(timerKey);  
       }  
   }  

来看看sendError的代码

public void sendError(HttpServletRequest request, HttpServletResponse response,  
           ServletContext ctx, int code, Exception e) {  
       if (devMode) {  
//开发模式,即Struts的配置文件中有设如下设置<constant name="struts.devMode" value="true" />  
           response.setContentType("text/html");  
  
           try {  
               FreemarkerManager mgr = getContainer().getInstance(FreemarkerManager.class);  
  
               freemarker.template.Configuration config = mgr.getConfiguration(ctx);  
               Template template = config.getTemplate("/org/apache/struts2/dispatcher/error.ftl");  
  
               List<Throwable> chain = new ArrayList<Throwable>();  
               Throwable cur = e;  
               chain.add(cur);  
               while ((cur = cur.getCause()) != null) {  
                   chain.add(cur);  
               }  
  
               HashMap<String,Object> data = new HashMap<String,Object>();  
               data.put("exception", e);  
               data.put("unknown", Location.UNKNOWN);  
               data.put("chain", chain);  
               data.put("locator", new Locator());  
               template.process(data, response.getWriter());  
               response.getWriter().close();  
           } catch (Exception exp) {  
               try {  
                   response.sendError(code, "Unable to show problem report: " + exp);  
               } catch (IOException ex) {  
                   // we're already sending an error, not much else we can do if more stuff breaks  
               }  
           }  
       } else {//普通模式  
           try {  
               // WW-1977: Only put errors in the request when code is a 500 error  
               if (code == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) {  
                   // send a http error response to use the servlet defined error handler  
                   // 原来异常被这样处理掉了  
                   request.setAttribute("javax.servlet.error.exception", e);  
  
                   // for compatibility  
                   request.setAttribute("javax.servlet.jsp.jspException", e);  
               }  
  
               // send the error response  
               response.sendError(code, e.getMessage());  
           } catch (IOException e1) {  
               // we're already sending an error, not much else we can do if more stuff breaks  
           }  
       }  
   }  


再把结果说明白一点,
1、开发模式:异常不好拿了,异常信息被直接写到页面,不过没关系,开发嘛,这不正是你想要的吗
2、正常模式:通过request.getAttribute("javax.servlet.error.exception")或者request.getAttribute("javax.servlet.jsp.jspException")可以取得异常对象。
分享到:
评论

相关推荐

    BusinessException.java

    BusinessException.java

    J2EE项目异常处理的几种方案

    除了拦截器外,Struts2还提供了全局异常处理配置,可以在`struts.xml`文件中指定全局异常映射,实现对特定异常类型的统一处理。 ```xml &lt;result name="error"&gt;/Web/common/page/error.jsp ``` 这样,每当...

    NC(UFIDA)错误帮助文档加强版

    业务异常nc.vo.pub.BusinessException类 第二节 开发问题集 UI工厂分为哪几大基本模块? 怎样配置eclipse参数? 单据开发涉及哪几大模板? pdm文件数据类型问题 制作单据模板的时候,主表或者子表的字段名显示不出来...

    NC开发常见问题记录.doc

    2. 设置表体中的0.00显示或显示为空 在单据或报表中,开发者可以通过设置getBillCardPanel().getBodyPanel().getRendererVO().setShowZeroLikeNull(false)方法来控制表体中的0.00显示或显示为空。在报表中,开发者...

    读取csv文档

    在Struts2框架下,我们可以使用Struts2的标签库来创建这样一个表单: ```jsp 全科目文件" required="true"/&gt; &lt;input type="file" name="datafile"&gt; &lt;!-- 这里定义了用于文件上传的input字段 --&gt; ``` 这里的...

    Maven+SpringMVC实现统一异常处理

    2. **SpringMVC配置** 在SpringMVC的配置文件(如:`servlet-context.xml`)中,我们需要开启注解驱动,以便使用@Controller、@RequestMapping等注解。同时,我们还需要配置HandlerExceptionResolver来处理异常。 ...

    基于hsweb的聚合支付系统完整源码+说明(多商户,多渠道,多配置).zip

    2、适用人群:主要针对计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、数学、电子信息等)的同学或企业员工下载使用,具有较高的学习借鉴价值。 3、不仅适合小白学习实战练习,也...

    ASP.NET Core 全局异常处理和日志记录

    public class BusinessException : Exception { public BusinessException(){} public BusinessException(string message) : base(message) {} public BusinessException(string message, Exception ...

    Enum Return Message

    2. **GlobalExceptionHandler.java**:这是一个全局异常处理器,用于捕获并处理应用程序中抛出的异常。在Spring框架中,这样的处理器可以通过@ControllerAdvice注解来实现。通过枚举ErrorEnum,可以将各种异常映射到...

    ARCH4系统开发指南

    2.28.2 Struts2校验框架应用 71 2.28.2.1 校验配置文件 71 2.28.2.2 角色Insert页面示例 71 2.28.2.3 用户Query页面示例 73 2.28.2.4 多行输入域校验 75 2.29 多语言管理 77 2.29.1 定义输入域的name属性和资源文件 ...

    阿里巴巴开发手册(嵩山版)下载

    2. 自定义异常:自定义异常应继承自已有的异常类,如BusinessException,便于统一处理。 三、并发控制 1. 线程安全:使用volatile确保变量可见性,使用synchronized保证线程安全,避免使用ThreadLocal过多导致内存...

    (源码)基于Spring Boot框架的报表管理系统.zip

    # 基于Spring Boot框架的报表... 自定义业务异常类 BusinessException、DataException 和 PageException,用于处理不同类型的异常情况。 3. 菜单管理 提供菜单数据访问对象 MenuDao,用于从数据库中获取菜单数据。

    NC后台任务插件开发代码

    2. `String datasource`:备份数据源,可能用于切换不同的数据源执行任务。 3. `LinkedHashMap, Object&gt; keyMap`:阈值参数的键值对,用于存放具体任务配置的参数值。 4. `String groupId`:集团ID,标识任务所属的...

    阿里巴巴Java开发手册终极版v1.3.0

    2. **自定义异常**:自定义异常时,继承自已有的异常类,如`BusinessException`,并提供详细的错误码和错误信息。 三、并发控制 1. **线程安全**:理解并发环境下数据同步的重要性,合理使用`synchronized`、`...

    阿里巴巴代码规范-idae版

    4. 业务异常应明确标识,如自定义`BusinessException`。 五、设计模式 1. 工厂模式:提供对象创建的统一接口。 2. 单例模式:保证类只有一个实例,常用于配置管理。 3. 观察者模式:定义对象间的一对多依赖关系,当...

    Spring Boot 如何自定义返回错误码错误信息

    BusinessException businessException = (BusinessException) ex; return ExceptionResponse.create(businessException.getCode(), businessException.getMessage()); } // ... } } ``` 通过自定义错误码和...

    springboot全局异常处理

    2. **使用@ControllerAdvice** `@ControllerAdvice`是Spring MVC提供的注解,用于标记一个类为全局异常处理器。这个类中的方法会在所有控制器方法执行后被检查,如果出现异常,这些方法会被调用。例如,可以创建一...

    UAP-STUDIO-6.5.0.2 适用于NC65产品二开工具

    用友NC65产品二开的集成开发环境

    spring统一异常与日志管理

    例如,如果抛出的是`DataAccessException`,我们可以抛出自定义的`BusinessException`,并附带特定的错误信息,以便在业务层进行处理。 ```java if (ex.getClass().equals(DataAccessException.class)) { throw ...

    ajax实现自动补全

    #### 2. 发起POST请求 `doRequestPost`函数负责发起Ajax POST请求,其参数为用户输入的值。请求的URL是从服务器端获取的上下文路径拼接而成的,请求成功后,调用`getInfor`函数处理响应数据。 ```javascript ...

Global site tag (gtag.js) - Google Analytics