как зациклить хотя цепь исключений вызывает в JSPX - PullRequest
1 голос
/ 14 марта 2012

У меня есть страница JSPX (X!), Где я хочу показать исключение (message и stacktrace), и все там вызывают исключение.Нет проблем распечатать первое исключение, но я не нашел способа «взаимодействовать» со всеми исключениями причины.

Конечно, я мог бы сделать что-то подобное:

<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 для такого сценария?

( Пожалуйста, не обсуждайте, что распечатка исключения вообще неверна. )

Ответы [ 5 ]

2 голосов
/ 28 марта 2012

Одним из обходных путей может быть использование 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 голос
/ 28 марта 2012

Вы можете использовать <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, надеюсь, вы не получите таких глубоких вложенных исключений:)

1 голос
/ 14 марта 2012

Быстрое решение может состоять в том, чтобы сначала создать список исключений, а затем выполнить итерацию по ним, используя 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 и параметров.

1 голос
/ 14 марта 2012

Невозможно выразить произвольный цикл while с помощью тегов JSTL, поэтому вы должны использовать скриптлеты.Обратите внимание, что вы можете использовать скриптлеты в JSPX в качестве элементов <jsp:scriptlet>.

В качестве альтернативы вы можете подготовить желаемое представление трассировки стека в сервлете (контроллер и т. Д.).Возможно, так будет лучше.

0 голосов
/ 21 октября 2013

Использование 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>
...