Me dieron la "oportunidad" de rescatar varios proyectos y los ejecutivos reemplazaron a todo el equipo de desarrollo porque la aplicación tenía demasiados errores y los usuarios estaban cansados de los problemas y los problemas. Todas estas bases de código tenían un manejo centralizado de errores en el nivel de la aplicación como se describe en la respuesta más votada. Si esa respuesta es la mejor práctica, ¿por qué no funcionó y permitió que el equipo de desarrollo anterior resolviera problemas? ¿Quizás a veces no funciona? Las respuestas anteriores no mencionan cuánto tiempo pasan los desarrolladores arreglando problemas individuales. Si el tiempo para resolver los problemas es la métrica clave, la mejor práctica es instrumentar el código con bloques try..catch.
¿Cómo solucionó mi equipo los problemas sin cambiar significativamente la interfaz de usuario? Simple, cada método se instrumentó con try..catch bloqueado y todo se registró en el punto de falla con el nombre del método, los valores de los parámetros del método concatenados en una cadena que se pasa junto con el mensaje de error, el mensaje de error, el nombre de la aplicación, la fecha, y versión Con esta información, los desarrolladores pueden ejecutar análisis sobre los errores para identificar la excepción que ocurre más. O el espacio de nombres con el mayor número de errores. También puede validar que un error que ocurre en un módulo se maneja adecuadamente y no es causado por múltiples razones.
Otro beneficio profesional de esto es que los desarrolladores pueden establecer un punto de interrupción en el método de registro de errores y con un punto de interrupción y un solo clic en el botón de depuración "salir", están en el método que falló con acceso completo al acceso real objetos en el punto de falla, convenientemente disponibles en la ventana inmediata. Hace que sea muy fácil depurar y permite arrastrar la ejecución al inicio del método para duplicar el problema y encontrar la línea exacta. ¿El manejo centralizado de excepciones permite a un desarrollador replicar una excepción en 30 segundos? No.
La afirmación "Un método solo debería detectar una excepción cuando puede manejarlo de una manera sensata". Esto implica que los desarrolladores pueden predecir o encontrarán todos los errores que puedan ocurrir antes del lanzamiento. Si esto fuera cierto en un nivel superior, el controlador de excepciones de la aplicación no sería necesario y no habría mercado para Elastic Search y logstash.
¡Este enfoque también permite a los desarrolladores encontrar y solucionar problemas intermitentes en la producción! ¿Desea depurar sin un depurador en producción? ¿O prefieres recibir llamadas y recibir correos electrónicos de usuarios molestos? Esto le permite solucionar problemas antes de que nadie más lo sepa y sin tener que enviar un correo electrónico, mensajería instantánea o Slack con soporte, ya que todo lo necesario para solucionar el problema está ahí. El 95% de los temas nunca necesitan ser reproducidos.
Para funcionar correctamente, debe combinarse con el registro centralizado que puede capturar el espacio de nombres / módulo, el nombre de clase, el método, las entradas y el mensaje de error y almacenarlos en una base de datos para que pueda agregarse y resaltar qué método falla más para que pueda ser arreglado primero.
A veces, los desarrolladores eligen lanzar excepciones desde un bloque catch, pero este enfoque es 100 veces más lento que el código normal que no arroja. Se prefiere la captura y liberación con registro.
Esta técnica se utilizó para estabilizar rápidamente una aplicación que fallaba cada hora para la mayoría de los usuarios en una compañía Fortune 500 desarrollada por 12 desarrolladores durante 2 años. Con esto, se identificaron, arreglaron, probaron y desplegaron 3000 excepciones diferentes en 4 meses. Esto promedia una solución cada 15 minutos en promedio durante 4 meses.
Estoy de acuerdo en que no es divertido escribir todo lo necesario para instrumentar el código y prefiero no mirar el código repetitivo, pero a la larga vale la pena agregar 4 líneas de código a cada método.