`

Struts2异常捕获与处理

阅读更多
最近更新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")可以取得异常对象。
   //刷屏,远离广告
分享到:
评论

相关推荐

    Struts2异常处理机制

    当Struts2与Spring集成时,可以在Spring的配置文件中定义AOP切面来处理异常,这可以进一步增强异常管理的灵活性。 通过以上这些方式,Struts2的异常处理机制为开发者提供了丰富的选项,能够确保程序在遇到异常时能...

    Struts2之异常处理案例struts003

    在Struts2中,异常处理是一项重要的功能,它确保在应用程序遇到错误时能够优雅地处理,提供友好的用户反馈,并保持系统稳定性。下面将详细讨论Struts2中的异常处理机制及其相关知识点。 1. **异常处理机制概述** ...

    struts手动异常处理

    2. **全局异常处理**:Struts允许我们在配置文件中定义全局异常映射,这样所有Action中的未捕获异常都会被映射到特定的结果页面。在`struts.xml`或`struts-default.xml`中,可以使用`&lt;global-exception-mappings&gt;`...

    struts2中异常处理(demo)

    4. **Struts2拦截器**:异常处理还与Struts2的拦截器机制密切相关。`ExceptionMappingInterceptor`是内置的拦截器之一,用于处理Action执行期间抛出的异常。开发者也可以编写自己的拦截器,添加到拦截器栈中,以实现...

    Struts1异常处理

    2. **Struts-config.xml配置异常处理**:在框架配置文件中,`&lt;global-exceptions&gt;`标签用于定义全局异常处理规则。例如: ```xml ``` 这段配置表示,如果任何地方抛出了`java.lang.Exception`或其子类,...

    Struts2 异常处理的四种获取属性方法

    Struts2提供了多种方式来捕获和处理异常,帮助开发者优雅地处理程序中的错误情况。以下是Struts2异常处理的四种主要方法,以及相关的知识点详解: 1. **全局异常映射(Global Exception Mapping)** 全局异常映射...

    struts2的异常处理机制

    Struts2的拦截器(Interceptor)也可以参与到异常处理中,通过实现`ExceptionMappingInterceptor`接口,可以在拦截器中捕获并处理异常,提供更灵活的异常处理策略。 通过以上机制,Struts2允许开发者在处理业务...

    struts2的异常处理

    Struts2提供了ActionError和FieldError接口,允许我们在Action类中捕获并添加错误信息,然后通过配置struts.xml文件,定义全局或特定Action的异常处理规则,使这些错误以JSON格式响应。 首先,你需要在Action类中抛...

    struts1.x 异常处理机制

    此外,对于Struts1.x中与Action相关的异常,如`org.apache.struts.action.ActionException`,你可以在Action类中直接抛出,框架会自动处理这些异常,并根据`struts-config.xml`中的配置进行相应操作。 总结来说,...

    struts2之声明式异常捕捉

    在Struts2的配置文件(通常是`struts.xml`或`struts.properties`)中,我们可以定义`&lt;exception-mapping&gt;`元素来指定异常与结果视图之间的映射关系。 以下是一个简单的示例,展示了如何在配置文件中设置声明式异常...

    Struts2的异常处理

    1. 全局异常处理:Struts2提供了一个`struts-default.xml`配置文件,其中可以定义一个`&lt;global-exception-mappings&gt;`标签来处理未被捕获的异常。例如,你可以为`NullPointerException`指定一个处理结果,这个结果...

    基于Struts的异常处理

    2. 创建自定义异常处理器,如`AppExceptionHandler`,继承自Struts提供的`ExceptionHandler`,覆盖`execute`方法来捕获和处理特定类型的异常。 3. 使用资源文件(如`MessageResources.properties`)存储错误消息,...

    struts与struts2的区别

    Struts2的异常处理更为优雅,它可以通过拦截器来捕获并处理异常,同时提供全局的异常处理策略,而在Struts1中,异常处理往往需要在每个Action中单独处理。 **7. 插件支持:** Struts2拥有丰富的插件系统,如JSON...

    struts2 单文件,多文件上传及拦截器实现异常处理

    在Struts2中,我们可以使用拦截器(Interceptor)来捕获和处理异常。定义一个自定义拦截器,继承`Interceptor`接口,重写`intercept`方法。在这个方法中,你可以检查Action执行是否抛出异常,并根据异常类型采取相应...

    Struts2视频教程

    - **异常处理**:配置异常拦截器,实现全局异常捕获和处理,提升用户体验。 - **文件上传与下载**:Struts2内置了对文件上传的支持,可以轻松实现文件上传功能;同时也可以配置下载功能,满足文件分发的需求。 - **...

    应用Struts2处理表单数据

    9. **异常处理(Exception Handling)**:通过配置全局异常处理,Struts2可以捕获并统一处理Action执行过程中的异常,提供一致的错误反馈。 10. **国际化(Internationalization, i18n)**:Struts2支持多语言,...

    struts2 学习重点笔记

    - **异常捕获**:通过异常拦截器捕捉并处理运行时异常。 - **错误页面**:配置错误视图,为用户提供友好的错误提示。 ### 结论 Struts2 是一个功能强大且灵活的 Web 开发框架,它不仅能够帮助开发者快速搭建 Web ...

    Struts 声明式异常处理和个性化异常处理

    拦截器可以在Action执行前后执行一些代码,包括异常捕获和处理。通过自定义拦截器,我们可以实现复杂的异常处理逻辑,如事务管理、权限验证等。 总的来说,Struts的异常处理机制为开发者提供了灵活的错误管理和用户...

Global site tag (gtag.js) - Google Analytics