我有一个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
循环?
(请不要讨论打印异常是错误的。)
答案 0 :(得分:2)
一种解决方法可能是使用贯穿原因链的foreach
。
foreach
中的运行次数将限制可显示的例外数量
不是很优雅,但既没有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>