1

我有一个 JSPX (X!) 页面,我想在其中显示一个异常(消息和堆栈跟踪),所有这些都会导致异常。打印第一个异常没有问题,但我还没有找到一种方法来“交互”所有原因异常。

当然我可以做这样的事情:

<c:out value="${exception.message}" />
<c:out value="${exception.stacktrace}" />

<c:if test=${exception.cause not null}>
   <c:set var="cause1" "${exception.cause}" />
   <c:out value="${cause1.message}" />
   <c:out value="${cause1.stacktrace}" />

   <c:if test=${cause1.cause not null}>
      <c:set var="cause2" "${cause1.cause}" />
      <c:out value="${cause2.message}" />
      <c:out value="${cause2.stacktrace}" />

      <c:if test=${cause2.cause not null}>
         <c:set var="cause3" "${cause2.cause}" />
         <c:out value="${cause3.message}" />
         <c:out value="${cause3.stacktrace}" />
      </c:if>
   </c:if>
</c:if>

但这很丑陋,如果有超过 3 个原因,就会失败。

所以我的问题是,如何while在 jspx 中为这种场景构建一个循环?

请不要讨论打印异常是错误的。

4

5 回答 5

2

一种解决方法可能是使用foreach贯穿原因链的方法。中的运行次数foreach将限制可以显示的异常数量。
不是很优雅,但既没有 awhile也没有 abreak它可能是最“灵活”的方式......

<c:set var="current_exception" value="${exception}" />
<c:forEach begin="0" end="10" step="1" var="i">
  <c:if test="${not empty current_exception}">
    <c:out value="${current_exception.message}" />
    <c:out value="${current_exception.stacktrace}" />
    <c:set var="current_exception" value="${current_exception.cause}" />
  </c:if>
</c:forEach>
于 2012-03-28T09:29:16.250 回答
1

没有办法while使用 JSTL 标签来表达任意循环,因此您必须使用 scriptlet。请注意,您可以在 JSPX 中使用 scriptlet 作为<jsp:scriptlet>元素。

或者,您可以在 servlet(控制器等)中准备所需的堆栈跟踪表示。也许这将是一个更好的方法。

于 2012-03-14T10:56:17.107 回答
1

一个快速的解决方案可能是首先构建异常列表,然后使用c:forEach.

或者,您可以尝试递归地包含一个 jsp 并将原因作为参数传递。像这样的东西:

<!-- Exception.jspx -->     
<c:out value="${exception.message}" />
<c:out value="${exception.stacktrace}" />
<c:if test=${exception.cause not null}>
  <c:set var="exception" value="${exception.scope}"/>
  <c:import url="Exception.jspx/>      
</c:if>

请注意,我没有对此进行测试,它可能无法按原样工作(这只是一个提示)。我们做了类似的事情,但使用了我们自己的包含和参数标签。

于 2012-03-14T10:58:57.063 回答
1

您可以<jsp:include>递归使用。

这是唯一的身体/WEB-INF/printexception.jsp可以看起来像:

<c:out value="${exception.message}" />
<c:out value="${exception.stackTrace}" />
<c:if test="${not empty exception.cause}">
    <c:set var="exception" value="${exception.cause}" scope="request" />
    <jsp:include page="printexception.jsp" />
</c:if>

在您的主要错误页面中按如下方式引用它:

<jsp:include page="/WEB-INF/printexception.jsp" />

请记住,堆栈级别通常“仅”~1000 深,希望您不会得到那么深的嵌套异常 :)

于 2012-03-28T14:24:50.803 回答
0

使用 JSTL 1.1+

${exception}
<div style="margin: 10px 0px 20px 60px">
   <c:forEach items="${exception.stackTrace}" var="entry">
      <c:out value="${entry}"/><br/>
   </c:forEach>
</div>
于 2013-10-21T12:06:49.397 回答