Entrei em um debate entre alguns amigos e eu. Eles preferem exceções gerais como ClientErrorExceptione ServerErrorExceptioncom detalhes como campos da exceção, enquanto eu prefiro tornar as coisas mais específicas. Por exemplo, eu posso ter algumas exceções, como:
BadRequestExceptionAuthenticationFailureExceptionProductNotFoundException
Cada uma delas foi criada com base no código de erro retornado da API.
Após as vantagens das exceções, isso parece idiomático para Java. No entanto, a opinião dos meus amigos não é exatamente incomum.
Existe uma maneira preferida em termos de legibilidade do código e usabilidade da API, ou realmente se resume apenas à preferência?
abstracte generalizar classes de exceção com os métodos getter e, em seguida, fazer com que as granulares estendam as gerais. Por exemplo AuthenticationFaliureException extends ClientErrorException. Dessa forma, todo usuário pode escolher como gostaria de lidar com as exceções. É mais trabalho, obviamente. No entanto, ao escrever um aplicativo (em vez de uma biblioteca), é uma situação diferente IMHO. Nesse caso, eu não tornaria as exceções mais granulares do que você precisa, por uma questão de simplicidade.