在JSTL中捕获异常的正确方法是什么

时间:2012-01-23 20:20:39

标签: jsp exception-handling jstl

在我们的一些遗留代码中,我们有一个进程可以获取我们的“基础”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/>

时,在源代码中

非常感谢有关此事的任何信息。

2 个答案:

答案 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并在那里处理异常。