JSP - Tratamento de Exceções

Neste capítulo. discutiremos como lidar com exceções em JSP. Ao escrever um código JSP, você pode cometer erros de codificação que podem ocorrer em qualquer parte do código. Podem ocorrer os seguintes tipos de erros em seu código JSP -

Exceções verificadas

Uma exceção verificada é uma exceção que normalmente é um erro do usuário ou um problema que não pode ser previsto pelo programador. Por exemplo, se um arquivo deve ser aberto, mas o arquivo não pode ser encontrado, ocorre uma exceção. Essas exceções não podem ser simplesmente ignoradas no momento da compilação.

Exceções de tempo de execução

Uma exceção de tempo de execução é uma exceção que provavelmente poderia ter sido evitada pelo programador. Ao contrário das exceções verificadas, as exceções de tempo de execução são ignoradas no momento da conclusão.

Erros

Não são exceções, mas problemas que surgem além do controle do usuário ou do programador. Os erros são normalmente ignorados em seu código porque você raramente pode fazer algo sobre um erro. Por exemplo, se ocorrer um estouro de pilha, ocorrerá um erro. Eles também são ignorados no momento da compilação.

Discutiremos mais maneiras de lidar com exceção / erro de tempo de execução que ocorre em seu código JSP.

Usando objeto de exceção

O objeto de exceção é uma instância de uma subclasse de Throwable (por exemplo, java.lang. NullPointerException) e está disponível apenas nas páginas de erro. A tabela a seguir lista os métodos importantes disponíveis na classe Throwable.

S.No. Métodos e Descrição
1

public String getMessage()

Retorna uma mensagem detalhada sobre a exceção que ocorreu. Esta mensagem é inicializada no construtor Throwable.

2

public Throwable getCause()

Retorna a causa da exceção conforme representado por um objeto Throwable.

3

public String toString()

Retorna o nome da classe concatenada com o resultado de getMessage().

4

public void printStackTrace()

Imprime o resultado de toString() junto com o rastreamento de pilha para System.err, o fluxo de saída de erro.

5

public StackTraceElement [] getStackTrace()

Retorna uma matriz contendo cada elemento no rastreamento da pilha. O elemento no índice 0 representa o topo da pilha de chamadas e o último elemento da matriz representa o método na parte inferior da pilha.

6

public Throwable fillInStackTrace()

Preenche o rastreamento de pilha deste objeto Throwable com o rastreamento de pilha atual, adicionando a qualquer informação anterior no rastreamento de pilha.

JSP oferece a opção de especificar Error Pagepara cada JSP. Sempre que a página lança uma exceção, o contêiner JSP invoca automaticamente a página de erro.

A seguir está um exemplo para especificar uma página de erro para um main.jsp. Para configurar uma página de erro, use o<%@ page errorPage = "xxx" %> diretiva.

<%@ page errorPage = "ShowError.jsp" %>

<html>
   <head>
      <title>Error Handling Example</title>
   </head>
   
   <body>
      <%
         // Throw an exception to invoke the error page
         int x = 1;
         
         if (x == 1) {
            throw new RuntimeException("Error condition!!!");
         }
      %>
   </body>
</html>

Agora escreveremos um Error Handling JSP ShowError.jsp, que é fornecido a seguir. Observe que a página de tratamento de erros inclui a diretiva<%@ page isErrorPage = "true" %>. Essa diretiva faz com que o compilador JSP gere a variável de instância de exceção.

<%@ page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <p>Sorry, an error occurred.</p>
      <p>Here is the exception stack trace: </p>
      <pre><% exception.printStackTrace(response.getWriter()); %></pre>
   </body>
</html>

Acesse o main.jsp, você receberá uma saída parecida com a seguinte -

java.lang.RuntimeException: Error condition!!!
......

Opps...
Sorry, an error occurred.

Here is the exception stack trace:

Usando tags JSTL para página de erro

Você pode usar tags JSTL para escrever uma página de erro ShowError.jsp. Esta página tem quase a mesma lógica do exemplo acima, com melhor estrutura e mais informações -

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

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <table width = "100%" border = "1">
         <tr valign = "top">
            <td width = "40%"><b>Error:</b></td>
            <td>${pageContext.exception}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>URI:</b></td>
            <td>${pageContext.errorData.requestURI}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>Status code:</b></td>
            <td>${pageContext.errorData.statusCode}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>Stack trace:</b></td>
            <td>
               <c:forEach var = "trace" 
                  items = "${pageContext.exception.stackTrace}">
                  <p>${trace}</p>
               </c:forEach>
            </td>
         </tr>
      </table>

   </body>
</html>

Acesse o main.jsp, o seguinte será gerado -

Opps...

Error:

java.lang.RuntimeException: Error condition!!!

URI:

/main.jsp

Status code:

500

Stack trace:

org.apache.jsp.main_jsp._jspService(main_jsp.java:65)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Usando Try ... Catch Block

Se você deseja lidar com erros na mesma página e deseja realizar alguma ação em vez de disparar uma página de erro, você pode usar o try....catch quadra.

A seguir está um exemplo simples que mostra como usar o bloco try ... catch. Vamos colocar o seguinte código em main.jsp -

<html>
   <head>
      <title>Try...Catch Example</title>
   </head>
   
   <body>
      <%
         try {
            int i = 1;
            i = i / 0;
            out.println("The answer is " + i);
         }
         catch (Exception e) {
            out.println("An exception occurred: " + e.getMessage());
         }
      %>
   </body>
</html>

Acesse o main.jsp, ele deve gerar uma saída parecida com a seguinte -

An exception occurred: / by zero