Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在jspx中循环通过异常原因链_Java_Jsp_Jstl_Jspx - Fatal编程技术网

Java 如何在jspx中循环通过异常原因链

Java 如何在jspx中循环通过异常原因链,java,jsp,jstl,jspx,Java,Jsp,Jstl,Jspx,我有一个JSPX(X!)页面,我想在其中显示一个异常(消息和stacktrace),所有这些都会导致异常。打印第一个异常没有问题,但我还没有找到一种方法来“交互”所有原因异常 当然,我可以这样做: <c:out value="${exception.message}" /> <c:out value="${exception.stacktrace}" /> <c:if test=${exception.cause not null}> <c:se

我有一个JSPX(X!)页面,我想在其中显示一个异常(消息和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个,就会失败

所以我的问题是,如何在jspx中为这种场景构建
while
循环


(请不要讨论打印异常是错误的。)

在使用JSTL标记进行循环时,无法表达任意的
,因此必须使用scriptlet。注意,您可以将JSPX中的scriptlet用作
元素


或者,您可以在servlet(控制器等)中准备所需的stacktrace表示。也许这是一种更好的方法。

在使用JSTL标记进行循环时,无法表达任意的
,因此必须使用scriptlet。注意,您可以将JSPX中的scriptlet用作
元素


或者,您可以在servlet(控制器等)中准备所需的stacktrace表示。也许这是一个更好的方法。

一个快速的解决方案可能是首先构建一个异常列表,然后使用
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>


一个快速的解决方案可能是首先构建一个异常列表,然后使用
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>


一种解决方法是使用贯穿整个原因链的
foreach
foreach
中的运行次数会限制可以显示的异常数量。
不是很优雅,但既没有
while
也没有
break
这可能是最“灵活”的方式


一种解决方法是使用贯穿整个原因链的
foreach
foreach
中的运行次数会限制可以显示的异常数量。
不是很优雅,但既没有
while
也没有
break
这可能是最“灵活”的方式


您可以递归地使用

下面是
/WEB-INF/printexception.jsp
的唯一主体的外观:


在您的主要错误页面中引用它,如下所示:


请记住,堆栈级别通常“只有”~1000深,希望不会得到那么深的嵌套异常:)

您可以递归地使用

下面是
/WEB-INF/printexception.jsp
的唯一主体的外观:


在您的主要错误页面中引用它,如下所示:


请记住,堆栈级别通常“只有”1000深,希望您不会得到那么深的嵌套异常:)

使用JSTL 1.1+

${exception}

使用JSTL 1.1+

${exception}


什么是
jspx
?我可以知道吗?以前从未见过它。它与jsp相关,比如HtmlX到Html。或者更准确地说,它是格式良好的(在xml的therms中)jsp。什么是
jspx
?我可以知道吗?以前从未见过它。它与jsp相关,比如HtmlX到Html。或者更准确地说,它是格式良好(在xml的therms中)的jsp(欢迎使用堆栈溢出),--我的问题不是stacktrace,而是异常(exception.cause)的原因,因为原因不是列表或数组。相反,您必须调用
e.getCause().getCause().getCause()…
(欢迎使用堆栈溢出),--我的问题不是堆栈跟踪,而是异常(exception.cause)的原因,因为原因不是列表或数组。相反,您必须调用
e.getCause().getCause().getCause()…