Olá desenvolvedores, hoje falaremos sobre como construir uma classe de exceção customizada. E faremos esta customização construindo uma classe Java estendendo a parte de exceções. O principal objetivo ao criar uma exceção customizada é a possibilidade de padronizar uma mensagem genérica. Ou ainda, capturar uma exceção lançada pela classe customizada atribuindo a ela uma mensagem específica.
Dessa forma, poderemos criar exceções que atendam ainda mais especificamente as regras de negócio. E a partir desta classe que nos permite uma melhor adequação as regras de negócio, poderemos tomar decisões. Por exemplo, quando for uma exceção da classe de erro do aluno, processamos uma determinada rotina, se não, uma rotina distinta será processada.
Seguindo o princípio de organização por meio de pacotes, criaremos um novo pacote. Clique com o botão direito do mouse sobre a pasta source (src) => new => package. Mantenha o padrão também para dar nome aos seus pacotes.
Agora criaremos uma nova classe, novamente clique com o botão direito sobre o pacoteque acabou de criar, new => class => ExcecaoProcessarNota.
CRIANDO UMA EXCEÇÃO CUSTOMIZADA
Para que esta nova classe possa se tornar uma exceção customizada será necessário estendê-la da classe Exception – que é a classe que lança exceções e que por sua vez estende a Throwable – pai de todos os erros.
O próximo passo será criar um construtor que receberá como parâmetro o erro que será do tipo String. E como usaremos a função da classe Exception, passaremos a mensagem por meio do super. Lembrando que o super(), em Java, é utilizado para referenciar/chamar o construtor do objeto pai quando existe uma herança de objetos.
Então estamos criando o construtor da classe ExcecaoProcessarNota e então chamando o construtor da classe pai. Isso porque que sempre que a classe for instanciada precisaremos obrigatoriamente passar uma mensagem. Estamos obrigando que a mensagem seja passada sempre que houver um new ExcecaoProcessarNota.
E como desejamos usar a função de lançamento da exceção, passamos a mensagem para o construtor da classe pai.
Super(erro);
Assim, temos uma classe filha para qual passamos a mensagem de erro a qual dispara a mensagem para a classe pai, neste caso, a classe responsável por lançar exceções e que fará todo o processo.
Na classe principal, onde criamos o arquivo vamos simular uma exceção no momento de processá-lo, porém, vamos envolver as linhas de código dentro de um bloco try/catch que estará dentro de outro bloco try.
File fil = new File("C://Line.txt");
Scanner scanner = new Scanner(fil);
TRATANDO UMA EXCEÇÃO SIMULADA
No bloco catch iremos tratar o erro FileNotFoundException, qual imprimiremos a mensagem de erro por meio do printStackTrace.
Ao executar o programa se o arquivo não estiver no caminho indicado uma exceção será lançada. Então poderemos criar um lançamento de exceção que ao capturar o FileNotFoundException invocando o ExcecaoProcessarNota e passar a mensagem “UM ERRO NO PROCESSAMENTO DO ARQUIVO FOI ENCONTRADO”.
Dessa forma iremos substituir o e.printStackTrace pela mensagem mostrada abaixo:
Throw new ExcecaoProcessarNota(“UM ERRO NO PROCESSAMENTO DO ARQUIVO FOI ENCONTRADO”)
O throw cumpre a função de chamar o método que deverá obrigatoriamente capturar uma exceção lançada, no caso o ExcecaoProcessarNota.Ao tentar executar o programa imediatamente uma mensagem de erro exibida.
A mesma mensagem que estabelecemos é apresentada no console para a equipe de desenvolvimento. Observe antes da mensagem, o nome da classe de exceção que criamos “ExcecaoProcessarNota”, sendo exibido também.
Note que interrompemos o fluxo de execução tão logo foi constatado que o arquivo não estava no caminho indicado. Ou seja, provocamos um erro inesperado no sistema.
NOVAS FORMAS DE IMPLEMENTAÇÃO
Outra opção para a personalização da classe de exceção é passar a mensagem lá no construtor e concatena-la ao erro. Veja como ficaria.
E assim capturar a mensagem.
throw new ExcecaoProcessarNota(e.getMessage());
Ao executar o lançamento de exceção funcionaria do mesmo jeito, porém, exibindo uma informação ainda mais detalhada.
Há ainda outro meio de se chegar ao mesmo resultado. Vamos liberar as nossas linhas de código que antes estavam envoltas em um bloco try/catch. E fora do escopo do bloco try implementaremos um método que receberá essas linhas de código.
Observe que o método “lerArquivo()” exigiu a implementação da exceção, e foi o quie fizemos como pôde notar acima.
Mas podemos fazer ainda melhor envolvendo novamente a linha de código em um bloco try/catch e então lançar a exceção. E utilizando um e.getMessage() para capturar a mensagem. No entanto, ainda nos exigirá que na assinatura do método, lancemos a exceção para cima, porém, agora poderemos lançar o ExceçãoProcessarNota.
Lançar para cima em linhas gerais significa delegar essa mensagem, indicando que a mesma deverá ser capturada no processo principal, isto é, o bloco try principal. Entenda, uma vez que a exceção customizada foi identificada, será “jogada” para a declaração do método, onde temos o throws ExcecaoProcessarNota. Este por sua vez delegará a mensagem para o método pai.
Assim, no bloco try principal procederemos com a chamada do método lerArquivo(). O que nos possibilitará capturar dentro de um Exception, a exceção customizada.
catch (ExcecaoProcessarNota e) {
e.printStackTrace();
JOPtionPane.showMessageDialog(null, "ERRO NA EXCEÇÃO CUSTOMIZADA: " +e.getClass().getName());
Ao executar…
EM OUTRAS PALAVRAS
Durante a execução ao tentar procurar o arquivo no caminho indicado, dentro do método lerArquivo() e não encontrá-lo, um erro é lançado. Mas ao se deparar com a classe scanner, poderemos verificar que ela lança pra cima um throws FileNotFoundException. E é por isso que capturamos este lançamento pra cima em um try/catch.
Dessa forma ao encontrar o erro, ele cai na exceção customizada que foi chamada dentro do método, esta por sua vez joga para o bloco try/catch principal onde implementamos a “ERRO NA EXCEÇÃO CUSTOMIZADA”. Falaremos mais sobre exceções lançamento de exceções para cima no próximo tutorial. Nos vemos lá.