2012-03-14 15 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

+0

これはHtmlXからHtmlのようなjspに関連しています。または、より正確には、それは(XMLの熱で)jspがうまく形成されているかどうかです。 – Ralph

答えて

2

回避策の1つは、一連の原因で実行されているforeachを使用することです。 foreachの実行回数は、表示可能な例外の数を制限します。
非常にエレガントしかしwhilebreakどちらもせずに、それはあなたが再帰的に<jsp:include>を使用することができ、おそらく...

<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のスクリプトレットは<jsp:scriptlet>要素として使用できます。

また、サーブレット(コントローラなど)で目的のstacktrace表現を準備することもできます。おそらく、より良いアプローチになるでしょう。

1

早急に解決策のリストを作成してから、c:forEachを使用してそれらの繰り返しを繰り返すことが簡単な解決策です。

また、jspを再帰的にインクルードし、その原因をパラメータとして渡すこともできます。

私はこれをテストせず、そのまま動作しないかもしれないことに注意してください(単なるヒントです)。同様のことをしましたが、独自のインクルードタグとパラメータタグを使用しました。

1

最も「柔軟な」方法ですされていません。ここで

/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深い、あなたはうまくその深い入れ子になった例外を取得しないでください:)

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

関連する問題