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

回避策の 1 つはforeach、一連の原因を実行することです。の実行数によって、foreach表示できる例外の数が制限されます。
あまりエレガントではありませんが、 awhileも a もなければ、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>
于 2012-03-28T09:29:16.250 に答える
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

whileJSTL タグを使用して任意のループを表現する方法はないため、スクリプトレットを使用する必要があります。<jsp:scriptlet>要素として JSPX のスクリプトレットを使用できることに注意してください。

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

于 2012-03-14T10:56:17.107 に答える
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 に答える