¿Cómo me recupero de una excepción no verificada?

Las excepciones no marcadas están bien si desea manejar cada falla de la misma manera, por ejemplo, registrándola y saltando a la siguiente solicitud, mostrando un mensaje al usuario y manejando el próximo evento, etc. Si este es mi caso de uso, todo lo que tengo que hacer es detectar algún tipo de excepción general en un nivel alto en mi sistema, y manejar todo de la misma manera.

Pero quiero recuperarme de problemas específicos, y no estoy seguro de la mejor manera de abordarlo con excepciones no controladas. Aquí hay un ejemplo concreto.

Supongamos que tengo una aplicación web, creada con Struts2 e Hibernate. Si una excepción aparece en mi "acción", la registro y le presento una bonita disculpa al usuario. Pero una de las funciones de mi aplicación web es crear nuevas cuentas de usuario, que requieren un nombre de usuario único. Si un usuario elige un nombre que ya existe, Hibernate lanza unorg.hibernate.exception.ConstraintViolationException (una excepción no verificada) en las entrañas de mi sistema. Realmente me gustaría recuperarme de este problema en particular, pidiéndole al usuario que elija otro nombre de usuario, en lugar de darles el mismo mensaje "registramos su problema pero por ahora está".

Aquí hay algunos puntos a considerar:

Hay muchas personas creando cuentas simultáneamente. No quiero bloquear toda la tabla de usuarios entre un "SELECCIONAR" para ver si el nombre existe y un "INSERTAR" si no existe. En el caso de las bases de datos relacionales, puede haber algunos trucos para solucionar esto, pero lo que realmente me interesa es el caso general en el que la comprobación previa de una excepción no funcionará debido a una condición fundamental de la carrera. Lo mismo podría aplicarse a la búsqueda de un archivo en el sistema de archivos, etc.Dada la propensión de mi CTO a la gestión de conducción inducida por la lectura de columnas de tecnología en "Inc.", necesito una capa de indirección en torno al mecanismo de persistencia para poder tirar Hibernate y usar Kodo, o lo que sea, sin cambiar nada excepto el más bajo. capa de código de persistencia. De hecho, hay varias capas de abstracción en mi sistema. ¿Cómo puedo evitar que se filtren a pesar de las excepciones no verificadas?Una de las debilidades declamadas de las excepciones comprobadas es tener que "manejarlas" en cada llamada en la pila, ya sea declarando que un método de llamada las arroja o capturándolas y manejándolas. Manejarlos a menudo significa envolverlos en otra excepción marcada de un tipo apropiado para el nivel de abstracción. Entonces, por ejemplo, en tierra de excepciones verificadas, una implementación basada en un sistema de archivos de mi UserRegistry podría capturarIOException, mientras que una implementación de base de datos capturaríaSQLException, pero ambos arrojarían unUserNotFoundException eso oculta la implementación subyacente. ¿Cómo aprovecho las excepciones no marcadas, evitándome la carga de esta envoltura en cada capa, sin perder detalles de implementación?

Respuestas a la pregunta(9)

Su respuesta a la pregunta