Janfrancisco
Recomendo a leitura do material da Caelum sobre Exceções (http://www.caelum.com.br/apostila-java-orientacao-objetos/excecoes-e-controle-de-erros/), principalmente a parte de “Motivação”, que explica o por que de se utilizar exceptions. Dentre outras coisas (como o tratamento de erros em si), eu vejo que o uso de exceptions permite desacoplar a implementação de uma classe da chamada a ela e um tratamento mais fino de determinadas regras de negócio.
Pegando um exemplo (simplista, talvez), imagine uma classe Cliente com um atributo cnpj (que pode ser alterado com o método setCnpj() ), que precisa ser validado antes de ser alterado. Sem usar exceptions, temos dois possíveis cenários:
- validar o cnpj informado antes de usar o método setCnpj(), mostrando uma mensagem. O método para validar o cnpj (algo como validaCnpj()) poderia de estar em uma classe assistente;
- dentro do método setCnpj(), haveria a validação (que também poderia ser de uma classe assistente);
O uso de um cnpj inválido é uma situação indesejada e deve ser evitada por poder levar a um estado inconsistente na aplicação. Mas no primeiro caso acima, o programador que usa a classe Cliente pode optar por simplesmente não verificar o cnpj (permitindo que a classe tenha um cnpj inválido), enquanto que, no segundo, se o método setCnpj() não interromper a execução do programa, o fato de o cnpj não ter sido alterado (já que era inválido) pode passar despercebido pelo programador que usa a classe Cliente. Além disso, nesse segundo caso, o método setCnpj() teria de exibir uma mensagem ao usuário (ou retorná-la), responsabilidade que esse método não deveria ter.
A exceção nesse caso é um jeito mais elegante de tratar essa situação, pois força que a situação anormal seja analisadapor quem chama o método que a dispara, ou seja, reforça a impressão de que a operação efetuada pode levar a um estado inconsistente e indesejado. A pessoa que utilizar o método setCnpj() pode optar sim por ignorar a exceção (com um catch que não faz nada, por exemplo), mas aí o estado inconsistente não ocorrerá por culpa da classe Cliente, mas por culpa da chamada ao método setCnpj() e de a exceção não ser tratada.
Abraço.