为什么struts2控制台不打印出错信息

本文深入探讨了Struts2框架中异常处理的工作原理,解释了为何控制台无法打印出错信息的原因,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么struts2控制台不打印出错信息,我已经按照网上说的做了,还是不行。为什么,我需要知道原因。
(我使用的是struts2.2.1)
要彻底搞清楚这个问题得从struts2的核心机制说起:

struts2的核心机制是interceptor,首先,假设所有拦截器的模型都是是before()-->invoke()-->after(),(这样假设为了理清思路,抓住主要原因)
让我们来看struts的执行过程:

1、首先请求触发调用核心过滤器的doFilter。
2、调用Dispatcher的serviceAction()分发请求。
3、找到请求对应的action代理StrutsActionProxy,执行execute,从而执行DefaultActionInvocation的invoke(),
这里可以说是核心调用的开始。
4、DefaultActionInvocation中的invoke方法 判断请求的action是否配置interceptor,如果interceptors.hasNext()为true,则调用第一个interceptor,在interceptor中再调用invocation.invoke(),然后调用第二个interceptor,如此反复(递归)。(注意此处只是调用的interceptor的before()-->invoke(),还没有调用after()方法)
像这样从上至下(对应action的interceptor配置)调用所有interceptor,最后通过invokeAction()调用真正action的方法。
5、最后从第一个interceptor开始,从上至下依次执行interceptor的after()。

由此可以得出struts2的核心执行顺序是最先执行的最先退出,即FIFO

网上有几篇文章都认为控制台不显示异常,是因为ExceptionMappingInterceptor:
@Override
public String intercept(ActionInvocation invocation) throws Exception {
String result;

try {
result = invocation.invoke();
} catch (Exception e) {
if (isLogEnabled()) {
handleLogging(e);
}
List<ExceptionMappingConfig> exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
String mappedResult = this.findResultFromExceptions(exceptionMappings, e);
if (mappedResult != null) {
result = mappedResult;
publishException(invocation, new ExceptionHolder(e));
} else {
throw e;
}
}

return result;
}

从代码中看出如果配置了handleLogging() ,就可以输出日志,这是没错,但是控制台还是不会有任何异常信息的。
只是因为在默认情况下(没有配置全局Exception的result),ExceptionMappingInterceptor会和其他的interceptor一样"throw e"。

接下来才是本文的重点,其实try…...catch…..finally 的捕捉过程也和struts2执行过程一样采取FIFO

那么也就是说如果从内至外的catch过程中,哪一步第一个e.printStackTrace(),不throw e,就会在哪一步看到控制台上输出异常。然而所有的interceptor默认情况下都throw e了,只有外层的Dispatcher的serviceAction()方法catch了,没有抛出,

catch (Exception e) {
sendError(request, response, context, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
}

sendError方法最后在error.ftl显示了异常信息,(如果是ajax请求,那么连error.ftl都不会跳,一旦出错,除非配置日志或者在action中直接catch,否则将什么迹象都没有,相当棘手)终结了这个异常,试想一下如果这里没有catch,继续抛(直到tomcat),或者多一句e.printStackTrace(),我们都可以在java控制台上看到出错信息。


以上就是没法在控制台上打印出出错信息的根本原因。至于解决办法,只能手动在action中catch 并printStackTrace,

或者重写框架类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值