如何在jsp中遍历异常原因链

时间:2012-03-14 10:42:33

标签: java jsp jstl jspx

我有一个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个原因就会失败。

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

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

5 个答案:

答案 0 :(得分:2)

一种解决方法可能是使用贯穿原因链的foreachforeach中的运行次数将限制可显示的例外数量 不是很优雅,但既没有while也没有break它可能是最“灵活”的方式......

<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>

答案 1 :(得分:1)

无法使用JSTL标记表达任意while循环,因此您必须使用scriptlet。请注意,您可以将JSPX中的scriptlet用作<jsp:scriptlet>元素。

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

答案 2 :(得分: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>

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

答案 3 :(得分: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深,您希望不会获得深层嵌套异常:)

答案 4 :(得分: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>