最近更新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与Spring集成时,可以在Spring的配置文件中定义AOP切面来处理异常,这可以进一步增强异常管理的灵活性。 通过以上这些方式,Struts2的异常处理机制为开发者提供了丰富的选项,能够确保程序在遇到异常时能...
在Struts2中,异常处理是一项重要的功能,它确保在应用程序遇到错误时能够优雅地处理,提供友好的用户反馈,并保持系统稳定性。下面将详细讨论Struts2中的异常处理机制及其相关知识点。 1. **异常处理机制概述** ...
2. **全局异常处理**:Struts允许我们在配置文件中定义全局异常映射,这样所有Action中的未捕获异常都会被映射到特定的结果页面。在`struts.xml`或`struts-default.xml`中,可以使用`<global-exception-mappings>`...
4. **Struts2拦截器**:异常处理还与Struts2的拦截器机制密切相关。`ExceptionMappingInterceptor`是内置的拦截器之一,用于处理Action执行期间抛出的异常。开发者也可以编写自己的拦截器,添加到拦截器栈中,以实现...
2. **Struts-config.xml配置异常处理**:在框架配置文件中,`<global-exceptions>`标签用于定义全局异常处理规则。例如: ```xml ``` 这段配置表示,如果任何地方抛出了`java.lang.Exception`或其子类,...
Struts2提供了多种方式来捕获和处理异常,帮助开发者优雅地处理程序中的错误情况。以下是Struts2异常处理的四种主要方法,以及相关的知识点详解: 1. **全局异常映射(Global Exception Mapping)** 全局异常映射...
Struts2的拦截器(Interceptor)也可以参与到异常处理中,通过实现`ExceptionMappingInterceptor`接口,可以在拦截器中捕获并处理异常,提供更灵活的异常处理策略。 通过以上机制,Struts2允许开发者在处理业务...
Struts2提供了ActionError和FieldError接口,允许我们在Action类中捕获并添加错误信息,然后通过配置struts.xml文件,定义全局或特定Action的异常处理规则,使这些错误以JSON格式响应。 首先,你需要在Action类中抛...
此外,对于Struts1.x中与Action相关的异常,如`org.apache.struts.action.ActionException`,你可以在Action类中直接抛出,框架会自动处理这些异常,并根据`struts-config.xml`中的配置进行相应操作。 总结来说,...
在Struts2的配置文件(通常是`struts.xml`或`struts.properties`)中,我们可以定义`<exception-mapping>`元素来指定异常与结果视图之间的映射关系。 以下是一个简单的示例,展示了如何在配置文件中设置声明式异常...
1. 全局异常处理:Struts2提供了一个`struts-default.xml`配置文件,其中可以定义一个`<global-exception-mappings>`标签来处理未被捕获的异常。例如,你可以为`NullPointerException`指定一个处理结果,这个结果...
2. 创建自定义异常处理器,如`AppExceptionHandler`,继承自Struts提供的`ExceptionHandler`,覆盖`execute`方法来捕获和处理特定类型的异常。 3. 使用资源文件(如`MessageResources.properties`)存储错误消息,...
Struts2的异常处理更为优雅,它可以通过拦截器来捕获并处理异常,同时提供全局的异常处理策略,而在Struts1中,异常处理往往需要在每个Action中单独处理。 **7. 插件支持:** Struts2拥有丰富的插件系统,如JSON...
在Struts2中,我们可以使用拦截器(Interceptor)来捕获和处理异常。定义一个自定义拦截器,继承`Interceptor`接口,重写`intercept`方法。在这个方法中,你可以检查Action执行是否抛出异常,并根据异常类型采取相应...
- **异常处理**:配置异常拦截器,实现全局异常捕获和处理,提升用户体验。 - **文件上传与下载**:Struts2内置了对文件上传的支持,可以轻松实现文件上传功能;同时也可以配置下载功能,满足文件分发的需求。 - **...
9. **异常处理(Exception Handling)**:通过配置全局异常处理,Struts2可以捕获并统一处理Action执行过程中的异常,提供一致的错误反馈。 10. **国际化(Internationalization, i18n)**:Struts2支持多语言,...
- **异常捕获**:通过异常拦截器捕捉并处理运行时异常。 - **错误页面**:配置错误视图,为用户提供友好的错误提示。 ### 结论 Struts2 是一个功能强大且灵活的 Web 开发框架,它不仅能够帮助开发者快速搭建 Web ...
拦截器可以在Action执行前后执行一些代码,包括异常捕获和处理。通过自定义拦截器,我们可以实现复杂的异常处理逻辑,如事务管理、权限验证等。 总的来说,Struts的异常处理机制为开发者提供了灵活的错误管理和用户...