Na minha empresa, estamos construindo um aplicativo da web contendo serviços centrais de servidor que nós mesmos projetamos e depois especificamos como interfaces. Ou seja, as interfaces são específicas de aplicativos e, em seguida, são implementadas com bibliotecas de terceiros, que podemos alterar com o tempo. Quando se trata de exceções, percebi que as exceções lançadas por nossos serviços devem ser nossas próprias exceções específicas de aplicativos, em vez de exceções específicas de implementação.
Agora, estou me perguntando como nossas exceções devem ser estruturadas e relacionadas entre si.
Primeiro, considere uma exceção genérica MyAppException
. Essa exceção indica que algo inesperado deu errado e a melhor coisa que podemos fazer é exibir uma mensagem para o usuário dizendo que algo deu errado e que estamos trabalhando nisso. O erro pode ser que o banco de dados travou ou algo parecido. Essa exceção seria praticamente lançada de todos os métodos que trabalham com o banco de dados.
Em segundo lugar, considere uma exceção MyAppDuplicateException
. Essa exceção indica que o usuário tentou salvar algo no banco de dados que já estava lá. Aqui, podemos exibir uma mensagem de erro muito mais específica e essa exceção é lançada apenas nos métodos que inserem ou atualizam linhas do banco de dados.
O aplicativo também pode conter outras exceções semelhantes a MyAppDuplicateException
outras situações de erro esperadas. Ex MyAppNotFoundException
etc ...
Agora às minhas perguntas:
- As outras exceções devem se estender
MyAppException
? Na verdade, não vejo razão para isso, acabei de vê-lo em muitos lugares e me pergunto se há um objetivo nisso. A desvantagem disso, como eu vejo, é que uma declaração de tentativa / captura não precisa se preocupar com a exceção específica nesse caso. Ele pode capturar apenas a exceção principal e, por isso, não precisa lidar com o erro específico, que era praticamente o ponto de ter a exceção específica. - Se as outras exceções não se estenderem
MyAppException
, deveMyAppException
ser umjava.lang.RuntimeException
? Isso não exigiria a execução de código para capturá-lo, o que para mim parece natural, pois o objetivo da exceção é dizer que algo desconhecido aconteceu e que o código em execução não é esperado para lidar com isso. O código no ponto de entrada da solicitação ainda pode ter uma instrução try / catch que capturaMyAppException
e garante que uma mensagem seja exibida para o usuário.
editar Não há dúvida de que as exceções específicas como MyAppDuplicateException
devem ser verificadas ou não, e devem ser verificadas definitivamente.