Tomcat的error-page掩盖action实例化的exception

在使用Struts2+Spring+Tomcat开发的时候,为了避免骚扰用户,线上系统我们一般会定义错误处理页面。但是如果开发环境中也这么做(在web.xml定义了错误转发页面),而碰巧某个action在实例化过程中出现了错误,那么错误消息会丢失,debug会很困难。因此建议开发环境中不要定义错误转发页面。

自定错误转发页面如下所示:

<error-page>

       <error-code>500</error-code>

       <location>/systembusy.vm</location>

</error-page>

我遇到的情况是,我的action中错误的引用了testng的logger,编译的时候没有问题,但是deploy的时候,testng.jar没有发布到web application中,导致action在实例化的时候,出现class not found的错误。为何编译的时候没有发现class 缺失呢,因为testng的scope是test,配置如下:

<dependency>

                     <groupId>org.testng</groupId>

                     <artifactId>testng</artifactId>

                     <version>6.1.1</version>

                     <scope>test</scope>

</dependency>

在debug的过程中,我发现struts2处理请求的过程分成两部:请求分发,action实例化。

请求分发的过程如下:

clip_image002

实例化过程如下:

clip_image004

可以看到struts2将实例化委托给Spring的bean factory完成实例化。如果实例化过程中出现exception,没有任何地方把log打印出来,只是会把错误发送到request的attributes里面,同时设置response的code为500.

Standard wrapper valve是tomcat的pipeline中的门户,在讲response返回给用户之前,它会根据web.xml的配置显示错误消息。如果它发现error 500对应的是systembusy.html,则会显示该页面。如果没有发现该配置,则会显示默认的页面,如下图所示:

clip_image005

虽然这个页面不能显示在线上,但是开发环境中这个信息还是弥足珍贵的。

posted @ 2013-10-24 22:06  永远是学生  阅读(1044)  评论(0编辑  收藏  举报