Pregunta

¿Cuál es una buena práctica de manejo de errores para un sitio asp.net? Ejemplos? Gracias!

¿Fue útil?

Solución

Al igual que con cualquier proyecto .net, creo que la mejor manera es capturar solo tipos de error específicos si es que pueden ocurrir en la página dada.

Por ejemplo, podría capturar las excepciones de formato para una entrada dada por los usuarios (solo en caso de que la validación de JavaScript falle y no haya usado Tryparse), pero siempre deje la captura de la excepción de nivel superior al controlador de errores global.

     try
        {
            //Code that could error here
        }
        catch (FormatException ex)
        {
            //Code to tell user of their error
            //all other errors will be handled 
            //by the global error handler
        }

Puede usar el código abierto elmah (Módulos y controladores de registro de errores) para ASP .Net para hacer este primer nivel / captura de error global para usted si lo desea.

El uso de elmah puede crear un registro de errores que es visible a través de un simple configurar la interfaz web. También puede filtrar diferentes tipos de errores y tener sus propias páginas de errores personalizadas para diferentes tipos de errores.

Otros consejos

Una práctica que me parece especialmente útil es crear una página de error genérica y luego configurar su DefaultRedirect en el nodo customErrors de web.config en esa página de error.

Luego configure su global.asax para registrar todas las excepciones no manejadas y luego colóquelas (las excepciones no manejadas) en una propiedad estática en alguna clase (tengo una clase llamada ErrorUtil con una propiedad estática LastError). La página de error puede ver esta propiedad para determinar qué mostrar al usuario.

Más detalles aquí: http://www.codeproject.com/KB/aspnet /JcGlobalErrorHandling.aspx

Bueno, eso está bastante abierto, lo cual es completamente genial. Le referiré a una palabra .doc que puede descargar desde Dot Net Spider , que en realidad es la base del código estándar de mi pequeña empresa. El estándar incluye algunos consejos muy útiles para el manejo de errores.

Uno de estos ejemplos de excepciones (no recuerdo si esto es original al documento o si lo agregamos al documento): Nunca haga una & # 8220; captura de excepción y no haga nada. & # 8221; Si oculta una excepción, nunca sabrá si se produjo la excepción. Siempre debe intentar evitar excepciones al verificar todas las condiciones de error mediante programación.

Ejemplo de lo que no se debe hacer:

try
{
   ...
}
catch{}

Muy travieso a menos que tengas una buena razón para ello.

Debe asegurarse de que puede detectar la mayoría de los errores que genera su aplicación y mostrar un mensaje amigable a los usuarios. Pero, por supuesto, no puede detectar todos los errores, por lo que puede usar web.config y defaultRedirect por otro usuario. Otra herramienta muy útil para registrar los errores es ELMAH. ELMAH registrará todos los errores generados por su aplicación y se los mostrará de manera muy legible. Conectar ELMAH en su aplicación es tan simple como agregar algunas líneas de código en el archivo web.config y adjuntar el ensamblaje. Definitivamente, debes darle una oportunidad a ELMAH, que literalmente te ahorrará horas y horas de dolor.

http://code.google.com/p/elmah/

  1. Defina el código de manera defensiva dentro de cada página para obtener las excepciones que espera que ocurran y trátelas adecuadamente, para no interrumpir al usuario cada vez que se produce una excepción.

  2. Registre todas las excepciones, con una referencia.

  3. Proporcione una página de error genérica, para cualquier excepción no manejada, que proporcione una referencia para usar como soporte (el soporte puede identificar detalles de los registros). No muestre la excepción real, ya que la mayoría de los usuarios no la entenderán, pero es un riesgo de seguridad potencial ya que expone información sobre su sistema (potencialmente contraseñas, etc.).

  4. No atrapes todas las excepciones y no hagas nada con ellas (como en la respuesta anterior). Casi nunca hay una buena razón para hacer esto, es posible que ocasionalmente quiera capturar una excepción específica y no hacer ninguna acción deliberada, pero debe usarla sabiamente.

No siempre es una buena idea redirigir al usuario a una página de error estándar. Si un usuario está trabajando en un formulario, es posible que no desee ser redirigido fuera del formulario en el que está trabajando. Puse todo el código que podría causar una excepción dentro de un bloque try / catch, y dentro del bloque catch escupí un mensaje de alerta alertando al usuario de que se produjo un error, así como también registré la excepción en una base de datos que incluye la entrada de formulario, la cadena de consulta Sin embargo, estoy desarrollando un sitio interno, así que la mayoría de los usuarios solo me llaman si tienen un problema. Para un sitio público, es posible que desee utilizar algo como elmah.

public string BookLesson(Customer_Info oCustomerInfo, CustLessonBook_Info oCustLessonBookInfo)
    {
        string authenticationID = string.Empty;
        int customerID = 0;
        string message = string.Empty;
        DA_Customer oDACustomer = new DA_Customer();

        using (TransactionScope scope = new TransactionScope())
        {
            if (oDACustomer.ValidateCustomerLoginName(oCustomerInfo.CustId, oCustomerInfo.CustLoginName) == "Y")
            {
                // if a new student
                if (oCustomerInfo.CustId == 0)
                {
                    oCustomerInfo.CustPassword = General.GeneratePassword(6, 8);
                    oCustomerInfo.CustPassword = new DA_InternalUser().GetPassword(oCustomerInfo.CustPassword, false);
                    authenticationID = oDACustomer.Register(oCustomerInfo, ref customerID);
                    oCustLessonBookInfo.CustId = customerID;
                }
                else // if existing student
                {
                    oCustomerInfo.UpdatedByCustomer = "Y";
                    authenticationID = oDACustomer.CustomerUpdateProfile(oCustomerInfo);
                }
                message = authenticationID;
                // insert lesson booking details
                new DA_Lesson().BookLesson(oCustLessonBookInfo);
            }

            else
            {
                message = "login exists";
            }
            scope.Complete();
            return message;
        }

    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top