English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JSP 异常处理

Quando si scrive un programma JSP, il programmatore potrebbe trascurare alcuni BUG, che potrebbero apparire in qualsiasi parte del programma. Nei codici JSP, ci sono generalmente i seguenti tipi di eccezioni:

  • Eccezione controllata: un'eccezione controllata è un errore tipico dell'utente o un errore che il programmatore non può prevedere. Esempio: se un file deve essere aperto ma non può essere trovato, viene lanciata un'eccezione. Queste eccezioni non possono essere semplicemente ignorate durante la compilazione.
  • Eccezione in esecuzione: un'eccezione in esecuzione potrebbe essere evitata dal programmatore, questa eccezione viene ignorata durante la compilazione.
  • Errore: l'errore non è un'eccezione, ma il problema è che è al di fuori del controllo dell'utente o del programmatore. Gli errori sono spesso ignorati nel codice e non si può fare molto al riguardo. Esempio: errore di overflow della pila. Questi errori vengono ignorati durante la compilazione.

Questa sezione fornirà alcuni modi semplici ed eleganti per gestire le eccezioni e gli errori in esecuzione.

Utilizzare l'oggetto Exception

L'oggetto exception è un esempio di sottoclasse di Throwable, disponibile solo nella pagina di errore. La tabella seguente elenca alcuni metodi importanti della classe Throwable:

Numero Metodo&Descrizione
1 public String getMessage()

Restituire l'informazione dell'eccezione. Questa informazione viene inizializzata nel costruttore di Throwable
2 public Throwable getCause()

Restituire la causa dell'eccezione, di tipo oggetto Throwable
3 public String toString()

Restituire il nome della classe
4 public void printStackTrace()

Esportare la traccia della pila dell'eccezione su System.err
5 public StackTraceElement [] getStackTrace()

Restituire la traccia della pila dell'eccezione come array di elementi di traccia della pila
6 public Throwable fillInStackTrace()

Utilizzare la traccia della pila corrente per riempire l'oggetto Throwable

JSP offre un'opzione per specificare una pagina di errore per ogni pagina JSP. Ogni volta che una pagina lancia un'eccezione, il container JSP chiama automaticamente la pagina di errore.

L'esempio seguente assegna una pagina di errore a main.jsp. Utilizzare l'istruzione <%@page errorPage="XXXXX"%> per specificare una pagina di errore.

<%@ page errorPage="ShowError.jsp" %>
<html>
<head>
   <title>Gestione degli Errori Esempio</title>
</head>
<body>
<%
   // Lanciare un'eccezione per invocare la pagina di errore
   int x = 1;
   if (x == 1)
   }
      throw new RuntimeException("Error condition!!!");
   }
%>
</body>
</html>

Ora, scrivete il file ShowError.jsp come segue:

<%@ page isErrorPage="true" %>
<html>
<head>
<title>Show Error Page</title>
</head>
<body>
<h1>Opps...</h1>
<p>Spiacenti, è capitato un errore.</p>
<p>Ecco la traccia di eccezione:</p>
<pre>
<% exception.printStackTrace(response.getWriter()); %>

Notare che il file ShowError.jsp utilizza l'instruzione <%@page isErrorPage="true"%>, che informa il compilatore JSP di generare una variabile di esempio di eccezione.

Ora provate a visitare la pagina main.jsp, che produrrà il seguente risultato:

java.lang.RuntimeException: Error condition!!!
......
Opps...
Spiacenti, è capitato un errore.
Ecco la traccia di eccezione:

Nella pagina di errore si utilizzano i tag JSTL

Si può utilizzare il tag JSTL per scrivere la pagina di errore ShowError.jsp. Il codice di questo esempio è quasi identico a quello dell'esempio precedente, ma ha una struttura migliore e può fornire più informazioni:

<%@ 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>

运行结果如下:

使用 try…catch块

如果您想要将异常处理放在一个页面中,并且对不同的异常进行不同的处理,那么您就需要使用try…catch块了。

接下来的这个例子显示了如何使用try…catch块,将这些代码放在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>

试着访问main.jsp,它将会产生如下结果:

An exception occurred: / by zero