¿Cómo se asignan los códigos de error?

13

¿Cómo, al desarrollar un proyecto de tamaño mediano, identifica, crea y mantiene códigos de error?

Por mi vida, no puedo pensar en un método simple y limpio para hacerlo. Algunas de mis ideas convierten los nombres de clase y el nombre del método en una cadena entera, pero esa es una forma demasiado larga de mostrar al usuario además del hecho de que los nombres de los métodos y los nombres de las clases pueden cambiar (¡con suerte no!). Otros simplemente están utilizando un sistema de registro incremental (es decir, cada vez que creo un nuevo mensaje de error, simplemente agregue 1 al último ID de mensaje de error). Pero eso está completamente desorganizado.

Para ser más específico, estoy hablando de código de error como:

Error 401 Unauthorized.

ahodder
fuente
1
códigos de error? ¿Como "números mágicos"? Por ejemplo ... ERROR 001. Luego vas a una lista y lees ERROR 001 significa que bla bla bla ... ¿Sí?
wleao
@wleao - Sí señor. Editaré mi pregunta para abarcar eso. Gracias.
ahodder
Como editaste en tu pregunta. Mira cómo lo hacen con http. No sé si es una buena idea usar números mágicos. Sin embargo, si realmente estás dispuesto a hacerlo, sigue sus conceptos. Por ejemplo, tienen una taxonomía de errores (¿tienes eso?).
wleao
@wleao: todavía no, pero gracias a ti y a Péter Török, definitivamente crearé uno. :)
ahodder

Respuestas:

16

No.

Los códigos de error son un anacronismo, provienen de los viejos tiempos cuando la salida era realmente difícil y costosa, y la única forma de señalar una condición de error puede haber sido a través de un montón de luces del panel frontal: pdp11 / 70 panel frontal

En estos días, tenemos un manejo de excepciones maduro integrado en casi todos los idiomas principales. Úsalo. Brinde al usuario información con la que pueda trabajar; no los moleste con bla bla bla técnico, sino más bien dígales aproximadamente qué salió mal y qué pueden hacer al respecto. Para iniciar sesión, solo asigne nombres descriptivos a sus excepciones y registre el nombre. Más fácil de recordar y también más fácil de encontrar utilizando grep o herramientas de búsqueda similares.

La excepción es, por supuesto, cuando está programando situaciones donde la salida aún es difícil y costosa, como los sistemas integrados o los protocolos de red. HTTP todavía usa códigos de respuesta numéricos porque son extremadamente fáciles de analizar de manera eficiente: en algunas situaciones, leer solo el primer dígito ya puede decirle lo suficiente y puede descartar el resto del paquete.

tdammers
fuente
Gracias por la respuesta detallada, eso tiene mucho sentido y es bueno saberlo.
ahodder
Su uso de la ilustración coincide perfectamente con su argumento. He leído sobre PDP-11 para siempre. Pero este es en realidad el primero que he visto. Gracias.
Mike Owens
2
Dentro del código, prefiero manejar un código de error y no soy tan viejo.
JeffO
@Jeff: cualquier cosa que puedas hacer con códigos de error también se puede hacer con excepciones, y luego un poco más. Si desea imitar códigos de error con excepciones, todo lo que necesita hacer es lanzar en lugar de devolver el código de error y capturar en lugar de comparar el valor de retorno con E_OK (o cualquiera que sea la respuesta correcta). Sin embargo, para ser justos, C no tiene excepciones reales, y los saltos largos no son tan convenientes, por lo que si está haciendo C, está algo excusado.
tdammers
@ Mike: La imagen es del artículo de Wikipedia sobre la serie PDP-11; si eso no es fácil de encontrar, no sé qué es.
tdammers
6

Debe verificar cómo se organizan los códigos de error / estado en protocolos comunes como HTTP . Reservan rangos distintos para diferentes tipos de estados / errores. Esto facilita que los usuarios identifiquen un código de estado desconocido y que los desarrolladores asignen un código para un nuevo tipo de error que no se haya manejado antes.

Péter Török
fuente
Agregue a su respuesta lo de la taxonomía. Facilitará la gestión y el mantenimiento de los errores.
wleao
3

Lo sentimos, ¿por qué usar códigos de error?
Captura la excepción, regístrate y ofrece enviar un informe si el programa no se puede recuperar .

(Suponiendo que su idioma admite excepciones).

La única información relevante que podría ayudarlo a solucionar el error es el seguimiento de la pila que no obtiene con un código de error. (También supongo que desea utilizar códigos de error para informes de error y no arrojarlos a la cara de un usuario).

Dan
fuente
Eso es muy cierto, y lo hago, pero ¿qué les diría a los usuarios? Estoy seguro de que estarían lívidos si estuvieran vendiendo y la aplicación simplemente muere, sin explicación ni nada que echarle humo.
ahodder
66
Creo que hay al menos tres cosas diferentes que se confunden aquí. El primero son los códigos utilizados de software a software, como en HTTP. El segundo son los códigos que los usuarios pueden usar en un informe de error (como los números de incidentes). Los últimos son mensajes que se pueden mostrar al usuario. Puede ser útil considerarlos como cosas separadas.
Darien
2
Una gran razón para usar códigos de error es cuando está creando una aplicación de fondo. Es mucho más fácil y más elegante para un programa cliente interpretar y responder a un código que a un mensaje de error o seguimiento de pila. No todos los errores son de errores.
Kaypro II
1
¡Las excepciones son muy difíciles de acertar! Ver enlaces en: programmers.stackexchange.com/questions/97874/…
Codificador del
@Coder: su ejemplo abusa de las excepciones. Deberías atrapar lo que esperas que te arrojen . La mayoría de los métodos no necesitan esperar ni una sola excepción. Es totalmente responsabilidad del programador decidir qué manejar y estoy de acuerdo en que puede ser difícil hacerlo bien .
Dan
2

Voy a asumir un contexto procesal (C). Si tiene objetos, un objeto de error suele ser mejor, ya sea una excepción o no.

Debe usar códigos de error locales para cada módulo. Para una biblioteca, puede tener un encabezado especial que enumere los códigos de error, con el número 1, 2, etc. (o -1, -2 si lo prefiere). Asegúrese de devolver siempre uno de estos códigos, por ejemplo, traducir errnoa sus propios códigos. Si tiene varias capas de módulos, traduzca en cada paso (o defina un rango para el error más profundo, por ejemplo, los valores 1001 - 1050 son de ese otro módulo).

También es importante que proporcione un medio para traducir el código en una cadena. Nunca debe informar solo el código, eso solo conduce a la frustración. En realidad, casi cualquier código en su aplicación debería venir con una función de traducción de cadenas. Por ejemplo, libc normalmente tiene strerrory strsignal, pero lamentablemente carece strwaitstatus.

Por Johansson
fuente
Fantástico detalle, gracias. Esto es realmente realmente útil.
ahodder