Giovanni Acerbi
a- a+

L'oggetto AspError

E' veramente difficile, se non impossibile, scrivererighe di codice che non contengano nemmeno un errore. Vi sonomolti errori possibili e alcuni potrebbero anche nondipendere da noi; il più classico èl'errore di sintassi (sintax error), poi vi sono erroridi logica di programmazione, errori che sono generati dalmalfunzionamento del server sul quale gira l'applicazionee poi vi sono errori che non vengono segnalati ma cherestituiscono un output sbagliato e tanti altri. Fin dasubito quindi conviene cercare di prevenire che si generinoerrori che siano poi difficili da rintracciare. Il primoaccorgimento da prendere è sicuramente quello diutilizzare sempre Option Explicit all'inizio delle pagine.asp per fare in modo che tutte le variabili debbano essereper forza dichiarate. Vediamo un esempio:

 

<%    intLato = 5    intAltezza = 10    Response.Write intLato * intAlteza%>

 

In questo caso, non si genera nessun errore mal'operazione base * altezza ci darà come risultato0 anziché 50 e tutto per colpa del fatto che abbiamodimenticato una zeta nello scrivere intAltezza nella rigadell'operazione. Vediamo come ci può aiutare inquesto 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 messaggiodel 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'altrol'utilizzo del codice indentato. Vediamo le differenze:

 

<%For intCont = 1 To 10Select Case intContCase 1,3,5,7,9Response.Write intCont & " è un numero dispari" & "<br>"Case ElseResponse.Write intCont & " è un numero pari" & "<br>"End SelectNext%>

 

Il codice qui sopra non è indentato ed èsicuramente più comodo nel caso di errore lo stessocodice scritto come segue:

 

<%For intCont = 1 To 10Select Case intContCase 1,3,5,7,9Response.Write intCont & " è un numero dispari" & "<br>"Case ElseResponse.Write intCont & " è un numero pari" & "<br>"End SelectNext%>

 

Un altro accorgimento può essere l'utilizzo dicommenti per poter trovare velocemente determinati pezzi dicodice all'interno di una pagina, vediamo come:

 

<%'    *****************************************************************'    INIZIO CICLO CONTROLLO NUMERO PARI O DISPARI'    *****************************************************************    For intCont = 1 To 10  Select Case intContCase 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 efunzioni per il riutilizzo del codice e la dichiarazionedelle variabili utilizzando le convenzioni viste inprecedenza per i nomi da assegnare alle variabili stesse(blnVar per una variabile di subtipo booleano, intVar per unavariabile di subtipo integer ecc...)

Ma cosa ci offre ASP per il controllo degli errori? In ASP2.0 si utilizzava l'oggetto Err, funzionante anche nellaversione 3.0, tramite il quale, assieme all'istruzione OnError Resume Next, si poteva forzare la pagina a nonterminare l'esecuzione del codice, ignorando gli erroriincontrati e non facendo visualizzare all'utente laclassica 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 adun indice dell'array fuori dall'intervallo consentitoe il messaggio di errore da noi generato si presentacosì:

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'oggettoASPError, l'unico oggetto interno nuovo rispetto alla2.0. La novità di questo oggetto è che ci aiutaa gestire gli errori in maniera personalizzata senza doverscrivere del codice all'interno di ogni pagina .asp. Siinterviene infatti direttamente sul server tramite l'IIS(Internet Information Services). Quando si verifica un errorenelle pagine .asp, viene generato l'errore HTTP 500;100.Si deve quindi intervenire sulle proprietà del sitotramite l'IIS e impostare una nuova pagina didestinazione in caso di errore al posto di quelle di default;sarà in questa pagina che si potrà utilizzarel'oggetto ASPError.

Quello che segue è un codice di esempio di una paginadi errore personalizzata che si presenteràall'utente nel caso in cui un errore del tipo 500;100 sigenerasse sul server:

 

<%Option ExplicitDim objAspError, strTableSet objAspError = Server.GetLastError()strTable = "<table align=""center"" border=""1"">" & vbCrLfstrTable = strTable & "<tr>" & vbCrLfstrTable = strTable & "<td nowrap>Codice ASP</td><td>" & objAspError.AspCode & "<br></td>" & vbCrLfstrTable = strTable & "</tr>" & vbCrLfstrTable = strTable & "<tr>" & vbCrLfstrTable = strTable & "<td nowrap>Numbero di Errore</td><td>" & objAspError.Number & "<br></td>" & vbCrLfstrTable = strTable & "</tr>" & vbCrLfstrTable = strTable & "<tr>" & vbCrLfstrTable = strTable & "<td nowrap>Origine</td><td>" & objAspError.Source & "<br></td>" & vbCrLfstrTable = strTable & "</tr>" & vbCrLfstrTable = strTable & "<tr>" & vbCrLfstrTable = strTable & "<td nowrap>Categoria</td><td>" & objAspError.Category & "<br></td>" & vbCrLfstrTable = strTable & "</tr>" & vbCrLfstrTable = strTable & "<tr>" & vbCrLfstrTable = strTable & "<td nowrap>Errore verificatosi in</td><td>" & objAspError.File & "<br></td>" & vbCrLfstrTable = strTable & "</tr>" & vbCrLfstrTable = strTable & "<tr>" & vbCrLfstrTable = strTable & "<td nowrap>Numero di linea</td><td>" & objAspError.Line & "<br></td>" & vbCrLfstrTable = strTable & "</tr>" & vbCrLfstrTable = strTable & "<tr>" & vbCrLfstrTable = strTable & "<td nowrap>Numero di colonna</td><td>" & objAspError.Column & "<br></td>" & vbCrLfstrTable = strTable & "</tr>" & vbCrLfstrTable = strTable & "<tr>" & vbCrLfstrTable = strTable & "<td nowrap>Descrizione</td><td>" & objAspError.Description & "<br></td>" & vbCrLfstrTable = strTable & "</tr>" & vbCrLfstrTable = strTable & "<tr>" & vbCrLfstrTable = strTable & "<td nowrap>Descrizione estesa</td><td>" & objAspError.ASPDescription & "<br></td>" & vbCrLfstrTable = strTable & "</tr>" & vbCrLfstrTable = 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 ASPErrortramite il metodo GetLastError dell'oggetto Serverdopodiché si genera una tabella riassuntiva checontiene tutte le proprietà che l'oggetto ASPErrorpuò 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 ASPErrorpuò riconoscere, errori interni ASP, errori delloscript, errori negli oggetti ed è in baseall'errore che si genera che la descrizionedell'errore può essere più o meno precisa.