L'oggetto AspError
E' veramente difficile, se non impossibile, scrivere righe di codice che non contengano nemmeno un errore. Vi sono molti errori possibili e alcuni potrebbero anche non dipendere da noi; il più classico è l'errore di sintassi (sintax error), poi vi sono errori di logica di programmazione, errori che sono generati dal malfunzionamento del server sul quale gira l'applicazione e poi vi sono errori che non vengono segnalati ma che restituiscono un output sbagliato e tanti altri. Fin da subito quindi conviene cercare di prevenire che si generino errori che siano poi difficili da rintracciare. Il primo accorgimento da prendere è sicuramente quello di utilizzare sempre Option Explicit all'inizio delle pagine .asp per fare in modo che tutte le variabili debbano essere per forza dichiarate. Vediamo un esempio:
<%
intLato = 5
intAltezza = 10
Response.Write intLato * intAlteza
%>
In questo caso, non si genera nessun errore ma l'operazione base * altezza ci darà come risultato 0 anziché 50 e tutto per colpa del fatto che abbiamo dimenticato una zeta nello scrivere intAltezza nella riga dell'operazione. Vediamo come ci può aiutare in questo caso l'Option Explicit:
<%
Option Explicit
Dim intLato, intAltezza
intLato = 5
intAltezza = 10
%>
<html>
<head>
<title>Base x altezza</title>
</head>
<body>
<%
Response.Write intLato * intAlteza
%>
</body>
</html>
In questo caso l'errore viene segnalato con un messaggio
del tipo seguente:
Errore di run-time di Microsoft VBScript (0x800A01F4)
Variabile non definita: 'intAlteza'
/asp/err.asp, line 13
Un'altra cosa che ci aiuta è senz'altro l'utilizzo del codice indentato. Vediamo le differenze:
<% For intCont = 1 To 10 Select Case intCont Case 1,3,5,7,9 Response.Write intCont & " è un numero dispari" & "<br>" Case Else Response.Write intCont & " è un numero pari" & "<br>" End Select Next %>
Il codice qui sopra non è indentato ed è sicuramente più comodo nel caso di errore lo stesso codice scritto come segue:
<% For intCont = 1 To 10 Select Case intCont Case 1,3,5,7,9 Response.Write intCont & " è un numero dispari" & "<br>" Case Else Response.Write intCont & " è un numero pari" & "<br>" End Select Next %>
Un altro accorgimento può essere l'utilizzo di commenti per poter trovare velocemente determinati pezzi di codice all'interno di una pagina, vediamo come:
<%
' *****************************************************************
' INIZIO CICLO CONTROLLO NUMERO PARI O DISPARI
' *****************************************************************
For intCont = 1 To 10
Select Case intCont
Case 1,3,5,7,9 ' IL NUMERO E' DISPARI
Response.Write intCont & " è un numero dispari" & "<br>"
Case Else ' IL NUMERO E' PARI
Response.Write intCont & " è un numero pari" & "<br>"
End Select
Next
' **************
' FINE CICLO
' **************
%>
E' consigliabile inoltre l'utilizzo di subroutine e funzioni per il riutilizzo del codice e la dichiarazione delle variabili utilizzando le convenzioni viste in precedenza per i nomi da assegnare alle variabili stesse (blnVar per una variabile di subtipo booleano, intVar per una variabile di subtipo integer ecc...)
Ma cosa ci offre ASP per il controllo degli errori? In ASP 2.0 si utilizzava l'oggetto Err, funzionante anche nella versione 3.0, tramite il quale, assieme all'istruzione On Error Resume Next, si poteva forzare la pagina a non terminare l'esecuzione del codice, ignorando gli errori incontrati e non facendo visualizzare all'utente la classica pagina di errore non troppo piacevole a vedersi. Vediamo un esempio:
<%
Dim arrMyArr(3)
On Error Resume Next
arrMyArr(5) = 6
If Err.Number > 0 Then
Response.Write "E' avvenuto un errore!!!" & "<br>"
Response.Write "Descrizione: " & Err.Description & "<br>"
Response.Write "Numero: " & Err.Number & "<br>"
Response.Write "Origine: " & Err.Source
End If
%>
In questo caso si è tentato di assegnare un valore ad
un indice dell'array fuori dall'intervallo consentito
e il messaggio di errore da noi generato si presenta
così:
E' avvenuto un errore!!!
Descrizione: Indice non incluso nell'intervallo
Numero: 9
Origine: Errore di run-time di Microsoft VBScript
La novità in ASP 3.0 è appunto l'oggetto ASPError, l'unico oggetto interno nuovo rispetto alla 2.0. La novità di questo oggetto è che ci aiuta a gestire gli errori in maniera personalizzata senza dover scrivere del codice all'interno di ogni pagina .asp. Si interviene infatti direttamente sul server tramite l'IIS (Internet Information Services). Quando si verifica un errore nelle pagine .asp, viene generato l'errore HTTP 500;100. Si deve quindi intervenire sulle proprietà del sito tramite l'IIS e impostare una nuova pagina di destinazione in caso di errore al posto di quelle di default; sarà in questa pagina che si potrà utilizzare l'oggetto ASPError.
Quello che segue è un codice di esempio di una pagina di errore personalizzata che si presenterà all'utente nel caso in cui un errore del tipo 500;100 si generasse sul server:
<% Option Explicit Dim objAspError, strTable Set objAspError = Server.GetLastError() strTable = "<table align=""center"" border=""1"">" & vbCrLf strTable = strTable & "<tr>" & vbCrLf strTable = strTable & "<td nowrap>Codice ASP</td><td>" & objAspError.AspCode & "<br></td>" & vbCrLf strTable = strTable & "</tr>" & vbCrLf strTable = strTable & "<tr>" & vbCrLf strTable = strTable & "<td nowrap>Numbero di Errore</td><td>" & objAspError.Number & "<br></td>" & vbCrLf strTable = strTable & "</tr>" & vbCrLf strTable = strTable & "<tr>" & vbCrLf strTable = strTable & "<td nowrap>Origine</td><td>" & objAspError.Source & "<br></td>" & vbCrLf strTable = strTable & "</tr>" & vbCrLf strTable = strTable & "<tr>" & vbCrLf strTable = strTable & "<td nowrap>Categoria</td><td>" & objAspError.Category & "<br></td>" & vbCrLf strTable = strTable & "</tr>" & vbCrLf strTable = strTable & "<tr>" & vbCrLf strTable = strTable & "<td nowrap>Errore verificatosi in</td><td>" & objAspError.File & "<br></td>" & vbCrLf strTable = strTable & "</tr>" & vbCrLf strTable = strTable & "<tr>" & vbCrLf strTable = strTable & "<td nowrap>Numero di linea</td><td>" & objAspError.Line & "<br></td>" & vbCrLf strTable = strTable & "</tr>" & vbCrLf strTable = strTable & "<tr>" & vbCrLf strTable = strTable & "<td nowrap>Numero di colonna</td><td>" & objAspError.Column & "<br></td>" & vbCrLf strTable = strTable & "</tr>" & vbCrLf strTable = strTable & "<tr>" & vbCrLf strTable = strTable & "<td nowrap>Descrizione</td><td>" & objAspError.Description & "<br></td>" & vbCrLf strTable = strTable & "</tr>" & vbCrLf strTable = strTable & "<tr>" & vbCrLf strTable = strTable & "<td nowrap>Descrizione estesa</td><td>" & objAspError.ASPDescription & "<br></td>" & vbCrLf strTable = strTable & "</tr>" & vbCrLf strTable = strTable & "</table>" & vbCrLf %> <html> <head> <title>Pagina di errore</title> </head> <body> <p align="center"><b>Si è verificato un errore!</b></p> <% = strTable %> <p align="center"><a href="default.asp">Torna alla Home Page</a></p> </body> </html>
Alla riga 4 si crea una istanza dell'oggetto ASPError
tramite il metodo GetLastError dell'oggetto Server
dopodiché si genera una tabella riassuntiva che
contiene tutte le proprietà che l'oggetto ASPError
può ritornare. Riassumiamo le proprietà
dell'oggetto di seguito:
ASPCode
Number
Source
Category
File
Line
Column
Description
ASPDescription
Ci sono tre categorie di errori che l'oggetto ASPError
può riconoscere, errori interni ASP, errori dello
script, errori negli oggetti ed è in base
all'errore che si genera che la descrizione
dell'errore può essere più o meno precisa.