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