He tenido un debate entre unos pocos amigos y yo. Prefieren excepciones generales como ClientErrorExceptiony ServerErrorExceptioncon detalles como campos de la excepción, mientras que prefiero hacer las cosas más específicas. Por ejemplo, podría tener un puñado de excepciones como:
BadRequestExceptionAuthenticationFailureExceptionProductNotFoundException
Cada uno de estos se basa en el código de error devuelto por la API.
Siguiendo las ventajas de las excepciones, esto parece idiomático para Java. Sin embargo, la opinión de mis amigos no es exactamente infrecuente.
¿Existe una forma preferida en términos de legibilidad de código y usabilidad de API, o realmente se reduce a la preferencia?
abstracty generalizar las clases de excepción con los métodos getter y luego hacer que las granulares amplíen las generales. Por ej AuthenticationFaliureException extends ClientErrorException. De esta manera, cada usuario puede elegir cómo quiere lidiar con las excepciones. Sin embargo, funciona más, obviamente. Sin embargo, al escribir una aplicación (en lugar de una biblioteca), es una situación diferente en mi humilde opinión. En ese caso, no haría que las excepciones sean más granulares de lo que las necesita, por simplicidad.