Ao escrever programas JSP, os programadores podem perder alguns bugs, e esses bugs podem aparecer em qualquer lugar do programa. Geralmente existem os seguintes tipos de exceções no código JSP:
Exceção verificada: Uma exceção verificada é um erro típico do usuário ou um erro que o programador não pode prever. Por exemplo, se um arquivo estiver prestes a ser aberto, mas não for possível encontrá-lo, uma exceção será lançada. Essas exceções não podem simplesmente ser ignoradas em tempo de compilação.
Exceções de tempo de execução: uma exceção de tempo de execução pode ter sido evitada pelo programador e será ignorada em tempo de compilação.
Erro: Não há exceção aqui, mas o problema é que está além do controle do usuário ou programador. Os erros são frequentemente ignorados no código e há pouco que você possa fazer a respeito. Por exemplo, erro de estouro de pilha. Esses erros serão ignorados em tempo de compilação.
Esta seção fornecerá várias maneiras simples e elegantes de lidar com exceções e erros de tempo de execução.
O objeto de exceção é uma instância de uma subclasse Throwable e está disponível apenas em páginas de erro. A tabela a seguir lista alguns métodos importantes na classe Throwable:
número de série | Método e Descrição |
---|---|
1 | public String getMessage() retorna informações de exceção. Esta informação é inicializada no construtor Throwable |
2 | public ThrowablegetCause() retorna a causa da exceção, o tipo é objeto Throwable |
3 | public String toString() retorna o nome da classe |
4 | public void printStackTrace() gera o rastreamento de pilha de exceção para System.err |
5 | public StackTraceElement [] getStackTrace() retorna o rastreamento de pilha de exceção na forma de uma matriz de elementos de rastreamento de pilha |
6 | public ThrowablefillInStackTrace() usa o rastreamento de pilha atual para preencher o objeto Throwable |
JSP fornece a opção de especificar páginas de erro para cada página JSP. Sempre que a página lança uma exceção, o contêiner JSP chama automaticamente a página de erro.
O exemplo a seguir especifica uma página de erro para main.jsp. Use a diretiva <%@page errorPage="XXXXX"%> para especificar uma página de erro.
<%@ page errorPage="ShowError.jsp" %><html><head> <title>Exemplo de tratamento de erros</title></head><body><% // Lança uma exceção para invocar a página de erro int x = 1; if (x == 1) { throw new RuntimeException("Condição de erro!!!");
Agora, escreva o arquivo ShowError.jsp da seguinte forma:
<%@ page isErrorPage="true" %><html><head><title>Mostrar página de erro</title></head><body><h1>Ops...</h1><p>Desculpe, ocorreu um erro.</p><p>Aqui está o rastreamento da pilha de exceções: </p><pre><% exceção.printStackTrace(response.getWriter() %>);
Observe que o arquivo ShowError.jsp usa a diretiva <%@page isErrorPage="true"%>, que informa ao compilador JSP que ele precisa gerar uma variável de instância de exceção.
Agora tente acessar a página main.jsp, ela produzirá os seguintes resultados:
java.lang.RuntimeException: Condição de erro!!!...Opps...Desculpe, ocorreu um erro. Aqui está o rastreamento de pilha de exceção:
Você pode usar tags JSTL para escrever a página de erro ShowError.jsp. O código neste exemplo tem quase a mesma lógica do código do exemplo anterior, mas o código neste exemplo é melhor estruturado e fornece mais informações:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page isErrorPage="true" %><html><head><title> Mostrar página de erro</title></head><body><h1>Ops...</h1><table><tr valign="top"><td><b>Erro:</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 código:</b></td><td>${pageContext.errorData.statusCode}</td></tr><tr valign="top"><td><b>Rastreamento de pilha:</b> </td><td><c:forEach var="traço" itens="${pageContext.exception.stackTrace}"><p>${trace}</p></c:forEach></td></tr></table></body></html>
Os resultados da execução são os seguintes:
Se você deseja colocar o tratamento de exceções em uma página e tratar diferentes exceções de maneira diferente, você precisa usar o bloco try...catch.
O exemplo a seguir mostra como usar um bloco try...catch colocando este código em main.jsp:
<html><head> <title>Tente...Catch Exemplo</title></head><body><% try{ int i = 1; + i); } catch (Exception e){ out.println("Ocorreu uma exceção: " + e.getMessage() } %></body></html>);
Tente acessar main.jsp, produzirá os seguintes resultados:
Ocorreu uma exceção: / por zero