Hvorfor ikke lade din globale applikationsfil håndtere alt din exception logging ? Ved hjælp af lidt lækkert LINQ og noget XML kan du nemt gemme dine exceptions til en simpel log. Det er vigtigt at du ikke bare “kaster en exception” da exceptions er resourcemæssigt dyre. Det er altid en god idé at logge sine exceptions, så man nemlig nemmere kan finde mulige fejl og rette dem. Følgende skal du ligge ind i Global.asax filen:
void Application_Error(object sender, EventArgs e)
{
Exception[] exceptions = HttpContext.Current.AllErrors;
if (exceptions != null)
{
if (exceptions.Count() > 0)
{
XDocument logFile = new XDocument(
new XElement("logfile", new XAttribute("date", DateTime.Now.Date),
from execp in exceptions
select new XElement("error", execp.InnerException)));
String filename = "/ErrorLogs/" + String.Format("{0:d}", DateTime.Now.Date) + ".xml";
FileInfo todaysLog = new FileInfo(
HttpContext.Current.Server.MapPath(filename)
);
if (!todaysLog.Exists)
{
logFile.Save(
HttpContext.Current.Server.MapPath(filename)
);
}
else
{
XDocument doc = XDocument.Load(HttpContext.Current.Server.MapPath(filename));
doc.Element("logfile").Add(from execp in exceptions
select new XElement("error", execp.InnerException));
doc.Save(
HttpContext.Current.Server.MapPath(filename)
);
}
}
}
}
Du kan teste det ved at “kaste en exception”.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
int d = DividedByZero(2, 0);
}
private Int32 DividedByZero(Int32 number, Int32 number2)
{
return (number / number2);
}
}
}
Resultatet er en daglig logfil.
<?xml version="1.0" encoding="utf-8"?>
<logfile date="2009-11-04T00:00:00+01:00">
<error>
System.DivideByZeroException: Attempted to divide by zero.
at WebApplication1._Default.DividedByZero(Int32 number, Int32
number2) in C:\Users\danielmf\Desktop\Kode\WebApplication1\WebApplication1\Default.aspx.cs:
line 19
....
....
....
</error>
</logfile>