¿Qué es una buena práctica de manejo de errores para un sitio asp.net? ¿Ejemplos? ¡Gracias!Buena práctica de manejo de errores
Respuesta
Al igual que con cualquier proyecto de .net que encontrar la mejor manera es sólo para coger los tipos de error específicos si son mayo a suceder en la página en cuestión.
Por ejemplo, podría capturar excepciones de formato para una entrada dada por los usuarios (solo en caso de que falle la validación de JavaScript y no haya utilizado tryparse) pero deje siempre la excepción de nivel superior en el controlador global de errores.
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
}
Usted puede utilizar el código abierto elmah (Módulos de registro de errores y controladores) para ASP.Net hacerlo nivel superior/captura de error global para usted si lo desea.
Usando elmah puede crear un registro de errores que se puede ver a través de una interfaz web fácil de configurar. También puede filtrar diferentes tipos de errores y tener páginas de error personalizadas para diferentes tipos de errores.
Una práctica que me parece especialmente útil es crear una página de error genérica, y luego establecer su defaultRedirect en el nodo customErrors del web.config a esa página de error.
Luego configure su archivo global.asax para registrar todas las excepciones no controladas y luego póngalas (las excepciones no controladas) en una propiedad estática en alguna clase (tengo una clase llamada ErrorUtil con una propiedad LastError estática). Su página de error puede mirar esta propiedad para determinar qué mostrar al usuario.
Más detalles aquí: http://www.codeproject.com/KB/aspnet/JcGlobalErrorHandling.aspx
Bueno, eso es bastante abierto, lo cual es completamente genial. Lo referiré a una palabra .doc que puede descargar desde Dot Net Spider, que en realidad es la base del estándar de código de mi pequeña empresa. El estándar incluye algunos consejos útiles para el manejo de errores.
Un ejemplo de excepciones (no recuerdo si esto es original del documento o si lo agregamos al documento): Nunca haga una "excepción de captura y no haga nada". Si oculta una excepción, nunca sabrás si ocurrió la excepción. Siempre debe intentar evitar las excepciones mediante el control programático de todas las condiciones de error.
ejemplo de lo que no se debe hacer:
try
{
...
}
catch{}
Muy malo a menos que tenga una buena razón para ello.
Debe asegurarse de poder 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 porque 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 lo mostrará de una manera muy legible. Conectar el 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 debe darle una oportunidad a ELMAH que literalmente le ahorrará horas y horas de dolor.
Código defensiva dentro de cada página para excepciones que espera que podría suceder y tratar con ellos adecuadamente, por lo que no perturbar al usuario cada vez que se produce una excepción.
Registra todas las excepciones, con una referencia.
Proporcione una página de error genérico, para cualquier excepción no controlada, que proporcione una referencia al uso 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 (contraseñas potencialmente, etc.).
No capte todas las excepciones y no haga nada con ellas (como en la respuesta anterior). Casi nunca hay una buena razón para hacer esto, de vez en cuando es posible que desee detectar una excepción específica y no hacer ninguna deliberadamente, pero esto debe usarse con prudencia.
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 que se lo redireccione 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 había producido un error y registrando la excepción en una base de datos que incluía entrada de formulario, cadena de consulta , etc. Estoy desarrollando un sitio interno, sin embargo, así que la mayoría de los usuarios solo me llaman si tienen un problema. Para un sitio público, es posible que desee usar algo como elmah.
¿Debo intentar bloquear todo? A veces no quiero capturar nada específico, y un error será capturado por un método más arriba en la jerarquía de todos modos.
Si este es el método principal, ¿cuál es la mejor práctica del método secundario?
private void mainMethod()
{
try
{
subMethod();
}
catch
{
//do something
}
}
Este:
private void subMethod()
{
try{
//code
//code
}
catch
{
throw;
}
}
O esto:
private void subMethod()
{
//code
//code
}
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;
}
}
No ha proporcionado ninguna explicación de cómo o por qué este bloque de código es relevante para la pregunta que se hace. – Hearth
- 1. Python - buena práctica para detectar errores
- 2. WCF: manejo de errores del lado del servidor. mejor práctica
- 3. PHP MySQL Registro y manejo de errores: mejor práctica
- 4. Manejo de errores de ActiveResource
- 5. Manejo de errores de PHP
- 6. Manejo de errores de HttpWebRequest.GetResponse
- 7. jQuery Manejo de errores AJAX
- 8. manejo de errores con .post()
- 9. Manejo de errores en PHP
- 10. Qt/C++ Manejo de errores
- 11. manejo de errores con BackgroundWorker
- 12. Delphi - FieldByName.AsString - buena práctica
- 13. ¿Una mala práctica para usar el GOTO de SQL Server para el manejo de errores?
- 14. Tarea de Rake: manejo de errores
- 15. WCF Servicio de datos Manejo de errores
- 16. Manejo de errores durante una copia de
- 17. Qt y estrategia de manejo de errores
- 18. Manejo de errores/estrategia de registro
- 19. Manejo de errores de conexión y JSoup
- 20. Buena práctica para multi-threading
- 21. ¿Buena práctica? iphone: datos de sincronización
- 22. ¿Es una buena práctica manejar los errores de Autenticación/Autorización usando excepciones?
- 23. MS-Access, VBA y manejo de errores
- 24. ASP.NET MVC 404 Manejo de errores
- 25. Manejo de errores personalizados en ASP MVC
- 26. Manejo de errores SQLAlchemy: ¿cómo se hace?
- 27. Manejo de errores Ajax en CakePHP
- 28. Errores de manejo adecuado en VBA (Excel)
- 29. Supervisión/manejo de errores en servidores web
- 30. Manejo de errores STL sin excepciones
que hacemos lo mismo para todas las excepciones no controladas. –
Suena muy inseguro, de valor cuestionable dado HttpContext.Current.Server.GetLastError() y por supuesto tiene el problema de redireccionamiento de 200 códigos en .NET2.0 – annakata
Suena muy inseguro, pero no trabajo con aplicaciones de tráfico lo suficientemente altas como para preocuparse por eso. Si trabajas con material de mayor tráfico, podría ser un problema. –