在我们的一些遗留代码中,我们有一个进程可以获取我们的“基础”JSP文件,并在整个应用程序中的所有JSP文件上粘贴页眉,页脚等以及我们想要的任何其他内容。这个过程添加到所有JSP的一件事是在scriptlet中围绕整个JSP的try-catch块。所以,最后,我们所有的JSP看起来都是这样的:
<%
try
{
%>
.... all the rest of the JSP .....
<%
}
catch(Exception e)
{
Log.error(e);
}
%>
我们最近摆脱了这个过程并将我们的JSP移到了使用JSTL而没有任何scriptlet。我们创建了一个标记,我们基本上围绕每个JSP执行页眉,页脚等。所以现在我们的JSP看起来像这样:
<foo:page>
.... all the rest of the JSP .....
</foo:page>
在进行此切换时,我们无法捕获加载页面时发生的任何异常。我做了一些环顾四周,找到了<c:catch>
标签。我试图把它放到我们的页面标签中,但我不能让它按照我们想要的方式工作。我发现,如果我将<c:catch>
标记放在页面标记中的<jsp:doBody/>
标记周围,它会捕获异常并且我可以对其执行某些操作。但是,这不会捕获此外部页面标记的其他部分中引发的任何异常。理想情况下,我会将整个页面标记用<c:catch>
标记括起来,但是当我这样做时,它似乎没有捕获异常。该页面在抛出异常时停止渲染。
我有相同的
<c:if test="${!(empty pageException)}">
ERROR!
</c:if>
在两种情况下都在<c:catch>
标记之后,但我实际上只看到“错误!”当<c:catch>
标记紧邻<jsp:doBody/>
非常感谢有关此事的任何信息。
答案 0 :(得分:2)
您可以在errorPage
指令中使用<%@ page %>
属性,而不是包装try catch块或<c:catch></c:catch>
块。
1.创建单个错误JSP页面,该页面处理应用程序中所有其他JSP页面上发生的错误。要将JSP页面指定为errorHandler页面,请使用此JSP页面指令:
<%@ page isErrorPage="true" %>`
在errorHandler JSP页面中,使用exception
隐式对象来检索异常详细信息。
2.在其他JSP页面中包含errorHandler JSP页面,使用此JSP指令指定如果当前页面上发生异常,请将请求转发到errorHandler.jsp:
<%@ page errorPage="/errorHandler.jsp" %>
答案 1 :(得分:1)
<c:catch>
应该有效。作为备份,您可以使用<foo:page>
类实现TryCatchFinally并在那里处理异常。