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

发布于 2024-12-28 08:09:32 字数 1158 浏览 3 评论 0原文

在我们拥有的一些遗留代码中,我们有一个流程来获取“基本”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>

在进行此切换时,我们失去了捕获加载页面时发生的任何异常的能力。我环顾四周,发现了 标签。我试图将其放入我们的页面标签中,但我无法完全让它按照我们想要的方式工作。我发现如果我将 标记放在 page 标记中的 标记周围,它会捕获异常我可以用它做点什么。但是,这不会捕获在此外部页面标记的其他部分中引发的任何异常。理想情况下,我会用 标记将整个页面标记括起来,但当我这样做时,它似乎没有捕获异常。页面在抛出异常时停止渲染。

都有相同的内容

<c:if test="${!(empty pageException)}">
    ERROR!
</c:if>

在这两种情况下,我在 标记后 ,但我实际上只看到“错误!”在源代码中,当 标记紧邻 时,

任何有关此的信息将不胜感激。

In some legacy code we had, we had a process that grab our "base" JSP files, and stick a header, footer, etc. and anything else we wanted on all the JSP files throughout the app. One thing this process added to all the JSPs was a try-catch block around the whole JSP in scriptlets. So, in the end, all our JSPs would look something like this:

<%
try
{
%>
.... all the rest of the JSP .....
<%
}
catch(Exception e)
{
    Log.error(e);
}
%>

We recently got rid of this process and moved our JSPs over to use JSTL and not have any scriptlets. We created a tag that we basically wrap around each JSP do the the header, footer, etc. So now our JSPs look something like this:

<foo:page>
.... all the rest of the JSP .....
</foo:page>

In making this switch, we lost the ability to catch any exceptions that happen while loading the page. I did some looking around and found the <c:catch> tag. I've tried to put this into our page tag, but I can't quite get it to work the way we want. I found that if I put the <c:catch> tag just around the <jsp:doBody/> tag in the page tag, it would catch the exception and I could do something with it. However, this won't catch any exceptions that are thrown in other parts of this outer page tag. Ideally I would enclose our entire page tag with the <c:catch> tag, but when I do that, it doesn't seem to catch the exception. The page just stops rendering at the point the exception was thrown.

I have the same

<c:if test="${!(empty pageException)}">
    ERROR!
</c:if>

after the <c:catch> tag in both cases, but I only actually see "ERROR!" in the source when the <c:catch> tag is immediately around the <jsp:doBody/>

Any information about this would be greatly appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

腹黑女流氓 2025-01-04 08:09:32

您可以在 <%@ page %> 指令中使用 errorPage 属性,而不是包装 try catch 块或 块。

1. 创建一个错误 JSP 页面,用于处理应用程序中所有其他 JSP 页面发生的错误。要将 JSP 页面指定为 errorHandler 页面,请使用以下 JSP 页面指令:

<%@ page isErrorPage="true" %>`

在 errorHandler JSP 页面中,使用 exception 隐式对象来检索异常详细信息。

2.在其他JSP页面中包含errorHandler JSP页面,通过该JSP指令指定如果当前页面出现异常,则将请求转发到errorHandler.jsp:

<%@ page errorPage="/ errorHandler.jsp"%>

You may use errorPage attribute in <%@ page %> directive instead of wraping of try catch block or <c:catch></c:catch> blocks.

1.Create a single error JSP page which handles the errors that occur across all the other JSP pages in the application. To specify a JSP page as an errorHandler page, use this JSP page directive:

<%@ page isErrorPage="true" %>`

In the errorHandler JSP page, use exception implicit object to retrieve exception details.

2.Include the errorHandler JSP page in other JSP pages, by using this JSP directive to specify that if there are exceptions occurring on the current page, forward the request to errorHandler.jsp:

<%@ page errorPage="/errorHandler.jsp" %>

以酷 2025-01-04 08:09:32

应该可以工作。作为备份,您可以让您的 类实现 TryCatchFinally 并在那里处理异常。

The <c:catch> should work. As a backup, you can have your <foo:page> class implement TryCatchFinally and handle the exception there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文