Información presentada al usuario.
Cuando se produce un error lo normal es presentar al usuario una pagina que le informe al usuario de dicho error y que al mismo tiempo le permite seguir usando la aplicación, lo idóneo es que dicha pagina le indique al usuario, que ha ocurrido, como le afecta el error producido en cuanto al proceso o transacción que estaba llevando a cabo, que debe hacer a partir de ese momento, y algún tipo de información sobre servicio de soporte de la aplicación.
Registrar el error.
Es evidente que el registro de nuestros errores es muy importante si no queremos que estos sigan ocurriendo, guardar información sobre el contexto en el cual se produjo el error nos permitirá determinar las causas del mismo y su posterior solución. La siguiente es una tabla con algunos datos que serán de tremenda ayuda en el diagnostico del error y como podemos obtener dicha información.
Date and time of exception |
DateTime.Now |
Machine name |
Environment.MachineName |
Exception source |
Exception.Source |
Exception type |
Type.FullName obtained from Object.GetType |
Exception message |
Exception.Message |
Exception stack trace |
Exception.StackTrace—this trace starts at the point the exception is thrown and is populated as it propagates up the call stack. |
Call stack |
Environment.StackTrace—the complete call stack. |
Application domain name |
AppDomain.FriendlyName |
Assembly name |
AssemblyName.FullName, in the System.Reflection namespace |
Assembly version |
Included in the AssemblyName.FullName |
Thread ID |
AppDomain.GetCurrentThreadId |
Thread user |
Thread.CurrentPrincipal in the System.Threading namespace |
Manejo de la excepción dentro de la aplicación.
En cuanto al manejo de la excepción lo idóneo es que la capa de presentación reciba excepciones creadas por nosotros a través de la creación de una clase que herede de ApplicationException , esto nos permitirá añadir contenido nuevo y personalizar nuestras excepciones que se produzcan en las capas de negocio o datos de manera que en la capa de presentación se pueda obtener acceso a mensajes de error que el usuario pueda entender. También al crear una nueva clase podemos realizar acciones en el constructor de la misma como el registro de los datos del error en basa de datos o en un archivo.
Por supuesto para realizar la captura de nuestro error en las capas intermedias de la aplicación tenemos que hacer uso intensivo de los bloques try{} catch{} ya que estos no permitirán capturar la excepción producida y convertirla en una personalizada por nosotros.
Si dejamos métodos en las capas intermedias sin captura de errores estos subirán hasta nuestra capa de presentación tal como se produjeron y generaran mensajes que no valdrán de nada para el usuario y expondrán debilidades de nuestra aplicación y generaría problemas se seguridad.
Tampoco hay que dejar de recordar que no deberíamos dejar bloques catch {} vacíos ya que esto produciría un comportamiento inestable o comprometer el correcto hilo de procesamiento de nuestras transacciones o inclusive generar inconsistencia de datos.
Los errores a nivel de aplicación que no hayan sido capturados deberán mostrar alguna pagina de error con la información para el usuario, para eso una buena opción es usar el evento Application_Error del Global.asax, desde donde podemos obtener el error producido y registrarlo para luego redirigir al usuario a una pagina de error.
void Application_Error( object sender, EventArgs e)
{
Exception ex = Server.GetLastError().GetBaseException();
Session[«ultimaException»] = ex;
Server.Transfer(«Error.aspx»);
}
Los errores a nivel de pagina también se pueden tratar usando el evento Page_Error de la pagina en el caso de que se quiera dejar al usuario seguir usando la pagina.
protected void Page_Error(Object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
// Aqui podrias registrar el error
// o redireccionarlo a otra pagina de error
}
Manejo de Errores en Ajax
Ya en un articulo anterior habíamos habado sobre este tema y mencionábamos que el ScriptManager posee un evento OnAsyncPostBackError que nos permite capturar los errores Ajax de nuestra aplicación de la siguiente manera.
<asp:ScriptManager ID=»ScriptManager1″ runat=»server»
OnAsyncPostBackError=»ScriptManager1_AsyncPostBackError» />
protected void ScriptManager1_AsyncPostBackError(object sender,AsyncPostBackErrorEventArgs e)
{
//manejo del error }
Para mayor información sobre manejo de excepciones pueden darse un paseo por la guía Design Guidelines for Exceptions que encontraran en la MSDN.
Este post esta basado en un artículo publicado en ingles por jankoatwarpspeed.com