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