Dirigiré mi respuesta más a lo que viene después de una excepción: para qué sirve y cómo debe comportarse el software, ¿qué deben hacer sus usuarios con la excepción? Una gran técnica que encontré al principio de mi carrera fue siempre informar problemas y errores en 3 partes: contexto, problema y solución. El uso de esta diciplina cambia enormemente el manejo de errores y hace que el software sea mucho mejor para que lo utilicen los operadores.
Aquí hay algunos ejemplos.
Context: Saving connection pooling configuration changes to disk.
Problem: Write permission denied on file '/xxx/yyy'.
Solution: Grant write permission to the file.
En este caso, el operador sabe exactamente qué hacer y a qué archivo debe verse afectado. También saben que los cambios de agrupación de conexiones no tomaron y deberían repetirse.
Context: Sending email to 'abc@xyz.com' regarding 'Blah'.
Problem: SMTP connection refused by server 'mail.xyz.com'.
Solution: Contact the mail server administrator to report a service problem. The email will be sent later. You may want to tell 'abc@xyz.com' about this problem.
Escribo sistemas del lado del servidor y mis operadores son generalmente expertos en tecnología de primera línea. Escribiría los mensajes de manera diferente para el software de escritorio que tiene una audiencia diferente pero incluye la misma información.
Varias cosas maravillosas suceden si uno usa esta técnica. El desarrollador de software a menudo está mejor ubicado para saber cómo resolver los problemas en su propio código, por lo que codificar las soluciones de esta manera a medida que escribe el código es de gran beneficio para los usuarios finales que están en desventaja al encontrar soluciones, ya que a menudo les falta información sobre qué estaba haciendo exactamente el software. Cualquiera que haya leído un mensaje de error de Oracle sabrá a qué me refiero.
La segunda cosa maravillosa que viene a la mente es cuando te encuentras tratando de describir una solución en tu excepción y estás escribiendo "Marque X y si A entonces B más C". Esta es una señal muy clara y obvia de que su excepción se está verificando en el lugar incorrecto. Usted, el programador, tiene la capacidad de comparar cosas en el código, por lo que las declaraciones "si" deben ejecutarse en el código, ¿por qué involucrar al usuario en algo que pueda automatizarse? Lo más probable es que es de más profundo en el código y alguien ha hecho lo vago y arrojado IOException de cualquier número de métodos y atrapado posibles errores de todos ellos en un bloque de código de llamada que no se puede describir adecuadamente lo que salió mal, lo que la específicacontexto es y cómo solucionarlo. Esto lo alienta a escribir errores de grano más fino, atraparlos y manejarlos en el lugar correcto en su código para que pueda articular adecuadamente los pasos que debe seguir el operador.
En una compañía teníamos operadores de primer nivel que conocían muy bien el software y mantenían su propio "libro de ejecución" que aumentaba nuestros informes de errores y las soluciones sugeridas. Para reconocer esto, el software comenzó a incluir enlaces wiki al libro de carreras en excepciones, de modo que una explicación básica estaba disponible, así como enlaces a discusiones y observaciones más avanzadas por parte de los operadores a lo largo del tiempo.
Si ha tenido la diciplina para probar esta técnica, se vuelve mucho más obvio qué debe nombrar sus excepciones en el código al crear el suyo. NonRecoverableConfigurationReadFailedException se convierte en una abreviatura de lo que está a punto de describir más completamente al operador. Me gusta ser detallado y creo que será más fácil de interpretar para el próximo desarrollador que toque mi código.