Diggie
Diggie

Reputation: 142

Best practice error handling in Global asax

I have code below in global asax now, I want to store exception log in database, is this good practice? because if sql error happens there, I want to log it too. So I am thinking changing the code below to write text log instead email, then on sql error, write text log.

void Application_Error(object sender, EventArgs e)
 {
    // Code that runs when an unhandled error occurs
    string testEnvironment = ConfigurationSettings.AppSettings["isTestEnvironment"];
    if (testEnvironment == "0")
    {
        Exception ex = Server.GetLastError();
         if (ex is HttpException && ex.InnerException is ViewStateException)
        {
          Response.Redirect(Request.Url.AbsoluteUri)                
          return
        }
        StringBuilder theBody = new StringBuilder();
        theBody.Append("URL: " + Request.Url + "\n");
        theBody.Append("Referer: " + Request.ServerVariables["HTTP_REFERER"] + "\n");
        theBody.Append("IP: " + Request.ServerVariables["REMOTE_HOST"] + "\n");
        theBody.Append("Error Message: " + ex.ToString() + "\n");
        if (User.Identity.IsAuthenticated)
            theBody.Append("User: " + User.Identity.Name + "\n");
        else
            theBody.Append("User is not logged in." + "\n");
        theBody.Append("Form Values: " + "\n");
        foreach (string s in Request.Form.AllKeys)
        {
            if (s != "__VIEWSTATE")
                theBody.Append(s + ":" + Request.Form[s] + "\n");
        }
        theBody.Append("Session Values: " + "\n");
        foreach (string s in Session.Keys)
            theBody.Append(s + ":" + Session[s] + "\n");
        System.Net.Mail.MailMessage email = new System.Net.Mail.MailMessage();
        email.IsBodyHtml = false;
        email.From = new System.Net.Mail.MailAddress("[email protected]", "ErrorManager");
        email.To.Add(new System.Net.Mail.MailAddress("[email protected]", "Developer"));
        email.Subject = Request.Url.ToString().Split('/')[2] + " has ASP.NET error";
        email.Body = theBody.ToString();
        try
        {
            System.Net.Mail.SmtpClient emailProvider = new System.Net.Mail.SmtpClient();
            emailProvider.Send(email);
        }
        catch (Exception anException)
        {
        }
        finally
        {
            if (Request.Url.Segments[Request.Url.Segments.Length - 1].ToLower() != "error.aspx")
                Response.Redirect("~/error.aspx?msg=4");
            else
            {
                Response.Write(@"We encountered an internal error. We apologize for any inconvenience
                but know that our staff gets emailed EVERY error that occurs so that we can solve it promptly.");
                Response.End();
            }
        }
    }
 }

Upvotes: 0

Views: 5482

Answers (1)

CAbbott
CAbbott

Reputation: 8098

You could log it to the EventLog. System admins can setup monitoring to see when new events are added and be alerted to potential problems.

Here's an example from MSDN for the EventLog class:

if(!EventLog.SourceExists("MySource"))
{
    //An event log source should not be created and immediately used. 
    //There is a latency time to enable the source, it should be created 
    //prior to executing the application that uses the source. 
    //Execute this sample a second time to use the new source.
    EventLog.CreateEventSource("MySource", "MyNewLog");
    Console.WriteLine("CreatedEventSource");
    Console.WriteLine("Exiting, execute the application a second time to use the source.");
    // The source is created.  Exit the application to allow it to be registered. 
    return;
}

// Create an EventLog instance and assign its source.
EventLog myLog = new EventLog();
myLog.Source = "MySource";

// Write an informational entry to the event log.    
myLog.WriteEntry("Writing to event log.");

Upvotes: 1

Related Questions