¿Puede recomendar un patrón / enfoque de diseño para exponer / tolerar / recuperarse de errores del sistema, manejo de excepciones (Java, C ++, Perl, PHP)?
Algunos errores deben ser reportados.
Algunos errores pueden manejarse internamente (mediante un reintento o son intrascendentes (pueden ignorarse).
¿Cómo estructura el código para atraparlos?
Pero todos los errores deben registrarse.
¿Qué mejores prácticas hay?
¿Y para simularlos para poder probar completamente los componentes afectados por ellos?
Pregunta general no específica del lenguaje de programación aplicable a varios lenguajes de programación modernos, pero sería bienvenida con ejemplos de patrones, enfoques y filosofías en Java, C ++, PHP y Perl.
(También se preguntó en stackoverflow: /programming/7432596/recommend-a-design-pattern-approach-to-exposing-tolerating-recovering-from-system pero pensé que debería preguntarse a los programadores también porque Creo que las preguntas y respuestas de los programadores cubren problemas más amplios de software / programación, mientras que stackoverflow trata más sobre la implementación técnica en mi humilde opinión).
fuente
Respuestas:
Fail fast es un gran enfoque de diseño, y tal vez se pueda contar como un patrón: http://en.wikipedia.org/wiki/Fail-fast
También he encontrado que varios principios son útiles:
fuente
Después de haber trabajado con excepciones en Java y .NET Y después de leer muchos artículos sobre cómo / cuándo / por qué capturar excepciones, finalmente se me ocurrieron los siguientes pasos que paso por mi cabeza cada vez que veo una posible excepción, o un excepción debo atrapar (Java) ... incluso si nunca sucede (suspiro ...). Y parece estar funcionando, al menos para mí:
También debo agregar el paso 0 , donde estoy lanzando a propósito lo que llamo una excepción "comercial" (una nueva excepción que creo al extender la clase "Excepción") cuando algún tratamiento complejo no puede ejecutarse debido a errores de datos, PERO eso se sabe que suceden ya que se han identificado como casos de excepción durante el análisis.
Excepto por la parte de registro, estoy totalmente de acuerdo con los puntos escritos por "mikera"; Solo agregaré que la excepción debe registrarse solo una vez .
Además, los pasos que enumeré pueden ser diferentes si lo que está escribiendo es un API / Framework . Allí, lanzar excepciones bien diseñadas es obligatorio para ayudar a los desarrolladores a comprender sus errores.
En cuanto a probar las excepciones, con el uso de objetos simulados debería poder probar casi todo, ya sea de forma excepcional o no, siempre que sus clases respeten la práctica recomendada de "una clase para hacer una cosa". También me aseguro de marcar los métodos más importantes pero ocultos como "protegidos" en lugar de "privados" para poder probarlos sin demasiados problemas. Aparte de eso, probar excepciones es simple, solo provoca la excepción y "espera" que ocurra una excepción al atraparla. Si no obtiene una excepción, entonces tiene un error de caso de prueba de unidad.
fuente
Construye tus objetos de la manera correcta, no te preocupes por factores externos. Si elige aprovechar las excepciones, haga que sus objetos arrojen excepciones si fallan en algo.
Una vez que todos sus objetos funcionan correctamente, debería ser bastante fácil encontrar una jerarquía de responsabilidad de manejo de errores limpia en su diseño.
fuente