Как распечатать трассировку стека ошибок на странице JSP? - программирование
Подтвердить что ты не робот

Как распечатать трассировку стека ошибок на странице JSP?

Я установил свою страницу с ошибкой, как это в web.xml:

 <error-page>
  <exception-type>java.lang.Exception</exception-type>
  <location>/errors/error.jsp</location>
 </error-page>

Теперь я хотел бы напечатать трассировку стека ошибки на JSP (конечно, только в режиме разработки). Как распечатать трассировку стека на моей странице JSP? Я не использую никаких фреймворков для этого приложения, поэтому для моей программы доступны только API-интерфейсы сервлетов по умолчанию.

4b9b3361

Ответ 1

получить параметр из запроса, который установлен внутри, и использовать его для печати и обработки другой информации, например cause, message

<c:set var="exception" value="${requestScope['javax.servlet.error.exception']}"/>

и распечатать stacktrace

<!-- Stack trace -->
<jsp:scriptlet>
  exception.printStackTrace(new java.io.PrintWriter(out));
</jsp:scriptlet>

См. также

Ответ 2

Следующие параметры будут установлены контейнером, когда запрос будет перенаправлен на страницу ошибки.

  • javax.servlet.error.status_code
  • javax.servlet.error.exception
  • javax.servlet.error.message
  • javax.servlet.error.request_uri
  • javax.servlet.error.servlet_name
  • javax.servlet.error.exception_type

В вашей ошибке JSP сделайте это,

<%request.getAttribute("javax.servlet.error.exception").printStackTrace(new java.io.PrintWriter(out))%>;

Или иначе Если ваша страница с ошибкой определена как страница с ошибкой, например, с Директивой страницы,

<%@ page isErrorPage="true" import="java.io.*"%>

Переменная сценария исключения будет объявлена в JSP. Вы можете распечатать переменную сценария, используя скриптлет, используя

exception.printStackTrace(new java.io.PrintWriter(out));

Или

<jsp:scriptlet>
    exception.printStackTrace(response.getWriter())
</jsp:scriptlet>

Ответ 3

Использование JSP-скриптлетов не одобряется практикой уже десять лет. Лучше избегать этого.

Если вы уже используете EL 2.2 или новее (Tomcat 7+, JBoss AS 6+, WildFly, GlassFish 3+ и т.д.) С новой поддержкой выражений методов в форме ${instance.method()}, то вы можете просто использовать 100% EL для этого.

Сначала необходимо явно очистить модуль записи JSP с помощью JspWriter#flush(), чтобы все предыдущие выходные данные шаблона JSP действительно записывались в модуль ответа сервлета:

${pageContext.out.flush()}

Затем вы можете просто передать ServletResponse#getWriter() to Throwable#printStackTrace().

${exception.printStackTrace(pageContext.response.writer)}

Полный пример:

<%@page pageEncoding="UTF-8" isErrorPage="true" %>
...
<pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre>

Если вы уже используете EL 3.0 (Tomcat 8+, WildFly, GlassFish 4+ и т.д.), вы даже можете сделать его одним выражением с помощью нового оператора точки с запятой, который разделяет операторы EL:

<%@page pageEncoding="UTF-8" isErrorPage="true" %>
...
<pre>${pageContext.out.flush();exception.printStackTrace(pageContext.response.writer)}</pre>

Если по какой-то причине вы не можете использовать isErrorPage="true" (и, следовательно, неявный объект ${exception} недоступен), просто замените его ${requestScope['javax.servlet.error.exception']}:

<%@page pageEncoding="UTF-8" %>
...
<pre>${pageContext.out.flush()}${requestScope['javax.servlet.error.exception'].printStackTrace(pageContext.response.writer)}</pre>

Если вы все еще не пользуетесь EL 2.2, тогда вам лучше всего создать собственную функцию EL. Подробности можно найти в . Каков хороший способ пересылки исключения из сервлетов на страницу jsp?

Ниже приведен более полный пример страницы с ошибкой:

<%@page pageEncoding="UTF-8" isErrorPage="true" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<ul>
    <li>Exception: <c:out value="${requestScope['javax.servlet.error.exception']}" /></li>
    <li>Exception type: <c:out value="${requestScope['javax.servlet.error.exception_type']}" /></li>
    <li>Exception message: <c:out value="${requestScope['javax.servlet.error.message']}" /></li>
    <li>Request URI: <c:out value="${requestScope['javax.servlet.error.request_uri']}" /></li>
    <li>Servlet name: <c:out value="${requestScope['javax.servlet.error.servlet_name']}" /></li>
    <li>Status code: <c:out value="${requestScope['javax.servlet.error.status_code']}" /></li>
    <li>Stack trace: <pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre></li>
</ul>

Ответ 4

Может быть, это помогает вам..
это будет show exception StackTrace в браузере

exception.printStackTrace(response.getWriter());  

Или

<%
  try{
     int test = Integer.parseInt("hola");
  }catch(Exception e){
     **// HERE THE MAGIC BEGINS!!**
     out.println("<div id=\"error\">");
     e.printStackTrace(new java.io.PrintWriter(out));
    out.println("</div>");
    **// THE MAGIC ENDS!!**
  }
%>

Если вы объявляете <% page isErrorPage="true" %> в верхней части error.jsp, то у вас есть доступ к брошенному Исключению (и, следовательно, также и к его геттерам) на ${exception}

<p>Message: ${exception.message}  

см. подробнее.. Отображение ошибок на экранах ошибок

Ответ 5

На странице с ошибкой просто выполните:

<jsp:scriptlet>
    exception.printStackTrace(response.getWriter())
</jsp:scriptlet>

Хотя это вызывает вопрос: что пользователь собирается делать с исключением. Почему бы не написать исключение из журнала ошибок, чтобы оно сохранялось, и вы можете вернуться к нему после того, как пользователь жалуется?

Ответ 6

Или, чтобы избежать использования сценариев в вашем jsp, используйте jstl:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
...

<c:set var="exception" value="${requestScope['javax.servlet.error.exception']}"/>

<c:if test="${exception != null}">
  <h4>${exception}</h4>
  <c:forEach var="stackTraceElem" items="${exception.stackTrace}">
    <c:out value="${stackTraceElem}"/><br/>
  </c:forEach>
</c:if>

В идеале, сценарии должны быть запрещены как наилучшая практика. Явно запретить скрипты в jsp файлах через конфигурацию web.xml:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>

Ответ 7

Объект "Брошенный исключение" доступен как атрибут запроса с именем "javax.servlet.error.exception". Итак, в вашем JSP вы можете написать:

<% request.getAttribute("javax.servlet.error.exception").printStackTrace(new java.io.PrintWriter(out); %>

Ответ 8

Вы можете использовать библиотеку ядра jstl

1) Импортировать вкладку поверх файла JSP

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

2) использовать тег

<c:catch var="myExceptionObject">
    Code that might throw Exception
</c:catch>

<c:if test="${myExceptionObject} != null">
    There was an exception: ${myExceptionObject.message}
</c:if>

Ответ 9

В error.jsp добавьте следующие строки

<%Logger log = Logger.getLogger("error_jsp.class");
Exception e = (Exception)request.getAttribute("javax.servlet.error.exception");
log.debug(request.getAttribute("javax.servlet.error.message"));
e.printStackTrace();
log.debug(e.getStackTrace());%>