我正在使用 Tomcat 5.5 和 Spring 3.2。在 web.xml 部署描述符中,我有以下配置 -
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/403.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
无法解释的行为发生在类似于以下方法的方法中 -
public ModelAndView fileDownload(HttpServletRequest request,
HttpServletResponse response) throws Exception
{
String filename = (String) request.getParameter("filename");
//...more code
File file = new File(...+ filename); // pseudo code
OutputStream out = response.getOutputStream();
InputStream stream = new FileInputStream(file); // FileNotFoundException here
//...more code
}
当发生 FileNotFoundException 时,我看不到用于呈现错误页面的自定义 500.jsp,而是在页面上看到异常的整个堆栈跟踪。如果我只是将两个语句的顺序颠倒如下,
InputStream stream = new FileInputStream(file); // FileNotFoundException here
OutputStream out = response.getOutputStream();
一切正常,我在页面上得到了正确的 500.jsp。
为什么会出现这种情况?唯一的区别是在后一种情况下,响应对象的OutputStream 没有打开。