Sei in: Per i Webmaster - Corso di ASP - 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.
