2012-03-14 17 views
1

我有一個JSPX(X!)頁面,我想顯示一個異常(消息和堆棧跟蹤),並在那裏引起異常。打印第一個異常沒有問題,但我還沒有找到一種方法來「整合」所有原因異常。如何循環雖然異常原因鏈jspx

當然,我可以做這樣的事情:

<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

什麼是'jspx'?我可以知道嗎?從未見過它。 – Lion 2012-03-14 10:50:16

+0

它與HtmlX to Html之類的jsp相關。或者更精確的是它的結構良好(在xml中)jsp。 – Ralph 2012-03-14 10:52:32

回答

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

沒有辦法使用JSTL標記來表示任意while循環,因此,你必須使用小腳本。請注意,您可以在JSPX中使用scriptlet作爲<jsp:scriptlet>元素。

或者,您可以在servlet(控制器等)中準備一個期望的stacktrace表示形式。也許這將是一個更好的方法。

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和parameter標籤。

1

可以使用<jsp:include>遞歸。

這裏是/WEB-INF/printexception.jsp的唯一機構怎麼能是這樣的:

<jsp:include page="/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> 

參考「〜1000深,你希望不會得到那麼深的嵌套例外:)

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

(歡迎使用堆棧溢出), - 我的問題不是堆棧跟蹤,而是異常的原因(exception.cause),因爲原因不是列表或數組。相反,你必須調用'e.getCause()。getCause()。getCause()...'。 – Ralph 2013-10-21 13:49:59