- Gestione degli errori in un sito ASP .Net -
 
COSA SERVE PER QUESTO TUTORIAL
Chiedi sul FORUM | Glossario cognizioni basiche di un qualsiasi linguaggio .Net
Come creare rapporti personalizzati su errori ASP .Net

UNA GESTIONE CENTRALIZZATA
L'evento Application_Error di global.asax.

Un sito ASP .Net inevitabilmente genera un certo numero di errori e in alcuni casi (primo tra tutti hosting condiviso) non è possibile accedere al Visualizzatore eventi di sistema (dove ASP .Net riporta tutte le pagine che hanno generato errori) o comunque si preferisce avere un resoconto in un database, in un file di testo o magari via e-mail degli errori che si sono verificati. ASP .Net mette a disposizione dello sviluppatore la possibilità di eseguire una funzione ogni volta che si genera un errore, tramite il file global.asax, file di codice semplice da usare e che permette di gestire eventi proprio come errori, richiesta di una qualsiasi pagina, inizio e termine di una sessione e così via. In questo caso siamo interessati all'evento Application_Error che viene appunto sollevato quando si genera un'eccezione (non gestita) su qualsiasi pagina del sito.

		
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    'Configurazione
    Dim blnAddInDatabase As Boolean = True
    Dim blnAddInTextFile As Boolean = True
    Dim blnSendEMail As Boolean = True
    Dim strErrorFile As String = Server.MapPath("/error_log.txt")

    'Parti salienti riguardanti l'errore
    Dim strUrl As String = Context.Request.RawUrl
    Dim strFilePath As String = Context.Request.FilePath
    Dim strRequestType As String = Context.Request.RequestType
    Dim strIP As String = Context.Request.ServerVariables("REMOTE_ADDR")
    Dim strHeaders As String = Context.Request.ServerVariables("ALL_RAW")
    Dim strException As String = String.Empty

    'Prendiamo informazioni sull'eccezioni e tutte le eccezioni interne
    Dim exc As Exception = Context.Error
    Do
        strException &= _
            "Type: " & exc.GetType().ToString() & vbNewLine & _
            "Message: " & exc.Message & vbNewLine & _
            "Stack trace: " & vbNewLine & exc.StackTrace & vbNewLine & vbNewLine
        exc = exc.InnerException
    Loop While exc IsNot Nothing


    If blnAddInDatabase Then

        Dim strSqlInsert As String = _
            "INSERT INTO Errors(`Date`, URL, FilePath, Request, IP, Headers, Exception) " & _
            "VALUES(Now(), ""{0}"", ""{1}"", ""{2}"", ""{3}"", ""{4}"", ""{5}"")"
        strSqlInsert = String.Format(strSqlInsert, _
            SQLEscape(strUrl), SQLEscape(strFilePath), SQLEscape(strRequestType), _
            SQLEscape(strIP), SQLEscape(strHeaders), SQLEscape(strException))

        'Mettere la vostra connessione al database
        Dim cnt As Odbc.OdbcConnection = GetConnection()
        Dim cmdInsert As New Odbc.OdbcCommand(strSqlInsert, cnt)
        cnt.Open()
        cmdInsert.ExecuteNonQuery()
        cnt.Close()

    End If

    Dim strTxtError As String
    If blnAddInTextFile OrElse blnSendEMail Then
        strTxtError = "Error ({0})" & vbNewLine & vbNewLine & _
            "URL: {1}" & vbNewLine & _
            "FilePath: {2}" & vbNewLine & _
            "Request: {3}" & vbNewLine & _
            "IP: {4}" & vbNewLine & vbNewLine & _
            "Headers:" & vbNewLine & "{5}" & vbNewLine & vbNewLine & _
            "Excpetion:" & vbNewLine & "{6}" & vbNewLine & vbNewLine & _
            vbNewLine & vbNewLine & vbNewLine & vbNewLine
        strTxtError = String.Format(strTxtError, Now.ToString(), strUrl, strFilePath, strRequestType, _
            strIP, strHeaders, strException)

        If blnAddInTextFile Then
            IO.File.AppendAllText(strErrorFile, strTxtError, System.Text.Encoding.UTF8)
        End If

        If blnSendEMail Then
            'La vostra funzione per mandare e-mail
            SendMail(strTxtError)
        End If

    End If

End Sub

Function SQLEscape(str As String) As String 
    Return str.Replace("""", """""")
End Function 

Il codice sopra è abbastanza semplice, non fa nient'altro che raccogliere alcune informazioni riguardanti la richiesta (se è GET o POST, URL, header HTTP e altro) e sull'errore, prendendo dettagli sull'eccezione, che però nella maggior parte dei casi è generica e bisogna pertanto guardare la InnerException che contiene il vero errore. Iterativamente raccogliamo informazioni su tutte le eccezioni annidate finché ve ne sono. L'oggetto usato per ottenere tutte queste informazioni è Context, di tipo System.Web.HttpContext. Infine scriviamo il tutto su file, in un database o lo inviamo via mail. Di seguito riportiamo la query SQL usata per creare la tabella degli errori:


CREATE TABLE `Errors` (
  `Date` datetime default NULL,
  `URL` text,
  `FilePath` text,
  `Request` varchar(10) default NULL,
  `IP` varchar(255) default NULL,
  `Exception` text,
  `Headers` text,
  `ID` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`ID`)
)

Infine riportiamo una semplice pagina per testare il comportamento in caso di errore:


<%
Throw New Exception("Prova")
%>

 

<< INDIETRO by VeNoM00