Mejores prácticas para crear un patrón de códigos de error para un proyecto empresarial en C # [cerrado]

43

Estoy trabajando en un proyecto empresarial que se implementará en muchas PYMES y empresas.
El soporte para este proyecto sería difícil, por lo que quiero crear un patrón de codificación para errores ( como códigos de estado HTTP ). Esto permitirá que las personas de la mesa de ayuda consulten los documentos y resuelvan los problemas lo antes posible.

¿Cuáles son las mejores prácticas y recomendaciones para hacer esto?
Cualquier ayuda para hacer esto será útil.

Pooya
fuente
1
Hay demasiadas respuestas posibles, o las buenas respuestas serían demasiado largas para este formato. Agregue detalles para limitar el conjunto de respuestas o para aislar un problema que puede responderse en unos pocos párrafos. ¿Y qué has intentado hasta ahora?
Ben McDougall
Depende de cómo esté estructurado su negocio. En C # siempre le dimos al usuario la posibilidad de enviarnos el StackTrace o copiarlo / pegarlo de los detalles del mensaje de error (no teníamos requisitos de seguridad estrictos).
Falcon el

Respuestas:

69

Hay una diferencia entre los códigos de error y los valores de retorno de error. Un código de error es para el usuario y la mesa de ayuda. Un valor de retorno de error es una técnica de codificación para indicar que su código ha encontrado un error.

Uno puede implementar códigos de error utilizando valores de retorno de error, pero recomendaría no hacerlo. Las excepciones son la forma moderna de informar errores, y no hay ninguna razón por la cual no deberían llevar un código de error dentro de ellas.

Así es como lo organizaría (tenga en cuenta que los puntos 2-6 son independientes del lenguaje):

  1. Use un tipo de excepción personalizado con una ErrorCodepropiedad adicional . La captura en el bucle principal informará este campo de la manera habitual (archivo de registro / mensaje emergente de error / respuesta de error). Use el mismo tipo de excepción en todo su código.
  2. No comience en 1 y no use ceros a la izquierda. Mantenga todos los códigos de error a la misma longitud, para que sea fácil detectar un código de error incorrecto. Comenzar en 1000 generalmente es lo suficientemente bueno. Tal vez agregue una 'E' inicial para que sean claramente identificables para los usuarios (especialmente útil cuando el servicio de asistencia técnica debe indicar a los usuarios cómo detectar el código de error).
  3. Mantenga una lista de todos los códigos de error, pero no haga esto en su código . Mantenga una breve lista en una página wiki para desarrolladores, que pueden editar fácilmente cuando necesiten un nuevo código. La mesa de ayuda debe tener una lista separada en su propia wiki.
  4. No intente imponer una estructura en los códigos de error. Siempre habrá errores difíciles de clasificar y no querrá discutir durante horas si un error debe estar en el grupo 45xx o en el grupo 54xx. Se pragmático .
  5. Asigne a cada lanzamiento en su código un código separado. Aunque piense que es la misma causa, la mesa de ayuda podría necesitar hacer cosas diferentes en diferentes casos. Es más fácil para ellos tener "E1234: Ver E1235" en su wiki, que hacer que el usuario confiese lo que ha hecho mal.
  6. Divida los códigos de error si la mesa de ayuda lo solicita. Una if (...) throw new FooException(1234, ".."); else throw new FooException(1235, "..");línea simple en su código puede ahorrarle media hora para la mesa de ayuda.

Y nunca olvide que el propósito de los códigos de error es facilitar la vida de la mesa de ayuda .

Sjoerd
fuente
Nunca lo he hecho personalmente, pero a menudo también se ven "identificadores de correlación", guías específicas de instancia de error que se muestran al usuario y también se registran. De esa manera, puede encontrar más fácilmente la ocurrencia exacta del error en los registros, más fácilmente que con un tiempo aproximado y un código de error.
xdhmoore
Supongo que probablemente haya una forma de incluir el código de error dentro de la identificación de correlación para que pueda servir como un código de error legible por humanos para la mesa de ayuda y como una identificación de instancia de error para los desarrolladores.
xdhmoore
Mi patrón es bastante similar. Pero en lugar de "E", agregué un corto de la parte de la aplicación. Nuestro marco de documentación tiene, por ejemplo, un Doc1234tiempo que puede tener la aplicación principal IrS1234. Por eso, mis colaboradores del servicio de asistencia son bastante rápidos al ayudar a mis usuarios.
Matthias Burger
6

Primero tiene que aislar las áreas donde pueden ocurrir errores, y son visibles para el usuario. Entonces puedes documentarlos. Es así de simple.

Bueno, simple en teoría ... en la práctica pueden ocurrir errores en todo el maldito lugar, y reportarlos puede convertir un buen código en un monstruo de registro, lanzamiento y manejo de excepciones, y pasar valores de retorno.

Entonces recomendaría un enfoque de 2 pasos. Primero es iniciar sesión, registrar lotes y lotes.

El segundo es determinar los componentes principales y sus interfaces, y definir en qué casos de errores mayores pueden encontrarse estos componentes. Luego, puede iniciar sesión de manera más visible cuando uno de estos errores (cómo maneja el error internamente depende de usted - las excepciones o los códigos de error no hacen ninguna diferencia aquí). Generalmente, un usuario verá el error e irá a los registros para obtener información más detallada.

Se utiliza el mismo enfoque para los servidores web y su ejemplo de código de error http. Si el usuario ve un 404, y lo informa como soporte, buscará en los registros los detalles de lo que estaba sucediendo, qué página se visitó, cuándo y recogerá cualquier otra información que pueda de donde sea que tenga sentido , estar en la base de datos, la red o la aplicación.

gbjbaanb
fuente
3

Iría por excepciones personalizadas con nombres descriptivos y mensajes claros y los arrojaría. Es mucho más fácil usar la infraestructura de excepción existente de un lenguaje que crear soporte para pasar códigos de error e interpretarlos.

Stefan Billiet
fuente
1
Agradecería a la persona que rechazó esta respuesta de 1 a 0 para al menos dar una razón ...
Stefan Billiet
1
No fui yo quien votó en contra (no es que importe, supéralo), pero creo que también existe soporte para valores de retorno en el lenguaje.
gbjbaanb
2
A mi me importa; si me equivoco, me gustaría saber para poder aprender :-p ¿Qué quieres decir con soporte existente para valores de retorno? ¿No tendría que escribir plomería para diferenciar un valor de retorno normal de un código de error? Traducir una excepción a un código de error en el límite de un sistema es una cosa, pero hacer malabares dentro de su sistema es algo que generalmente se desaconseja. Creo que The Pragmatic Programmer menciona este tipo de cosas.
Stefan Billiet
1
las excepciones no son un buen mecanismo en todos los casos, pero si decidió usar errores, puede agregar un parámetro de salida a cada llamada o hacer que todas las llamadas importantes devuelvan un código. Simplemente decide por adelantado hacer eso, y eres dorado. Pragmáticamente, terminas con una mezcla de los dos: devolviendo códigos de error en los límites (para que no estés encerrado en un solo idioma) y usando excepciones internamente.
gbjbaanb
66
No te rechacé (tómalo con calma, de lo contrario todos tendrán que repetir esto :). Si trabajó o llamó al servicio de asistencia técnica, es mucho más fácil comunicar un número corto que un mensaje de error. Se garantiza que un mensaje de error cambiará cuando se comunique oralmente.
Codismo