miércoles, 10 de febrero de 2010

Gestión y serialización de errores

En nuestras páginas necesitamos gestionar los errores no contralados. Una buena práctica es guardar un log de errores en XML. Si intentamos serializar la excepción (Exception) nos dar un error. Hay varias alternativas en internet pero yo estoy probando con algo sencillo y entendible.

Me he creado una clase Errores y dentro de ella un método que tendremos que poner en cada try catch.

El método:

public
class
Errores

{


const string cSaltoASP = "\r\n";

public Errores()

{

//


// TODO: Agregar aquí la lógica del constructor


//

}

public
static
void Gestionar(Exception pErr)

{

string wCarpetaLog = ConfigurationManager.AppSettings["CarpetaLog"].ToString() + @"\Excepciones\";

string wDocPath = wCarpetaLog + "fileErrores.xml";

string PathXml = wDocPath;


DataTable dt = new
DataTable("Excepcion");

dt.Columns.Add("NowTime");

dt.Columns.Add("Data");

dt.Columns.Add("HelpLink");

dt.Columns.Add("InnerException");

dt.Columns.Add("Message");

dt.Columns.Add("Source");

dt.Columns.Add("StackTrace");

dt.Columns.Add("TargetSite");



DataRow dr = dt.NewRow();

dr["NowTime"] = Excelium.Generales.AAAAMMDD(DateTime.Today) + " " + DateTime.Now.ToShortTimeString();



if (pErr.Data != null)

{

dr["Data"] = pErr.Data.ToString();

}


if (pErr.HelpLink != null)

{

dr["HelpLink"] = pErr.HelpLink.ToString();

}


if (pErr.InnerException != null)

{

dr["InnerException"] = pErr.InnerException.ToString();

}


if (pErr.Message != null)

{

dr["Message"] = pErr.Message.ToString();

}


if (pErr.Source != null)

{

dr["Source"] = pErr.Source.ToString();

}


if (pErr.StackTrace != null)

{

dr["StackTrace"] = pErr.StackTrace.ToString();

}


if (pErr.TargetSite != null)

{

dr["TargetSite"] = pErr.TargetSite.ToString();

}


dt.Rows.Add(dr);



DataSet ds = new
DataSet("Excepciones");

ds.Tables.Add(dt);



FileStream fs = null;

fs = new
FileStream(PathXml, FileMode.Append, FileAccess.Write);

ds.WriteXml(fs);

fs.Close();



string sAll = string.Empty;



using (System.IO.StreamReader sr = new System.IO.StreamReader(PathXml, System.Text.Encoding.Default))

{

sAll = sr.ReadToEnd();

}


//



sAll = sAll.Replace(cSaltoASP,"");

sAll = sAll.Replace("</Excepciones><Excepciones>", "");


//


using (System.IO.StreamWriter sw = new System.IO.StreamWriter(PathXml, false, System.Text.Encoding.Default))

{

sw.WriteLine(sAll);

sw.Flush();

}

}

}

Su Uso.


try

{


//Nuestro código;

catch (Exception e)

{


Errores.Gestionar(e);

}

Aviso.

Estoy probando todavía y queda mejorarlo.