Quando estamos desenvolvendo nosso código, temos como objetivo principal que ele funcione como o esperado, ou seja, sem nenhum tipo de erro. Existem situações entretanto, que nos forçam a considerar a possibilidade de um erro ocorrer.
Por exemplo, quando desenvolvemos um sistema integrado com outras ferramentas, é fundamental considerarmos que essas ferramentas possam não estar disponíveis no momento da execução do nosso código.
No exemplo citado, não considerar essa possível indisponibilidade momentânea poderia fazer com que, durante a utilização do nosso sistema, erros, bugs e / ou comportamentos inesperados viessem a ocorrer.
Sintaxe
Dessa forma, para tratar uma possível exceção dentro do nosso código tempos uma estrutura chamada "try/catch". Fazendo uma tradução não literal, podemos entendê-la como "tente/caso ocorra um erro". Sendo a sua sintaxe padrão a seguinte:
try {
// Código a tentar executar...
} catch (Exception e) {
// Código a executar caso o código dentro do "try" gerar alguma exceção.
};
Perceba que dentro da nossa cláusula "catch" definimos que ela vai receber uma instancia da classe "Exception". Esta classe é nativa do Java é já contem alguns métodos padrão interessantes para esse contexto de tratamento de erros, os dois mais utilizados são:
printStackTrace()
Este método gera no console da sua IDE, ou então arquivo de log do Tomcat, etc, uma descrição do erro gerado, contendo toda a sequência de operações que tentou-se executar e gerou o erro. Aqui, é exibida até o arquivo, classe e linha que gerou a exceção.
getLocalizedMessage()
Este método retorna uma mensagem mais limpa a respeito do erro ocorrido, a depender do tipo de erro encontrado pode não conter todas as informações necessárias a nível de desenvolvimento para a solução do problema, mas para nível de usuário pode servir.
Dentro dessa sintaxe podemos inserir quantas cláusulas "catch" forem necessárias. Existem situações em que diferentes tipos de exceções poderão ser retornadas do nosso código, podem ser adicionadas mais cláusulas catch caso seja necessário realizar uma operação diferente para cada tipo de erro retornado.
Além disso, temos ainda a cláusula "finally" para sgaratir que um código será executado após o tratamento das diversas exceções que podem ser geradas.
Exemplo:
try {
// Código a tentar executar...
} catch (NullPointerException e) {
// Código a executar caso o código dentro do "try" gerar alguma exceção do tipo NullPointerException.
} catch (TimeoutException e) {
// Código a executar caso o código dentro do "try" gerar alguma exceção do tipo TimeoutException.
} finally {
// Código a executar após os tratamentos de erro anteriores.
};
Tipos de Exceptions
A classe Exception possui diversas classes que a herdam, utilizadas para identificar problemas cada vez mais específicos. Algumas das classes filhas de Exception são:
NullPointerException
Gerada quando algum método ao ser chamado retornou nulo e seu código não esperava isso.
TimeoutException
Gerada quando o a execução de um determindado script demorou mais do que o tempo estipulado. Por exemplo, quando uma API demora demais para retornar um valor.
ClassNotFoundException
Gerada quando dentro do seu código você faz referência a uma classe não existente. Gerada por exemplo quando esquecemos de realizar algum import de uma classe utilizada no nosso código.
NumberFormatException
Gerada quando é atribuído um valor em formato não esperado a uma varável de tipo numérico. Por exemplo ao tentar atribuir o valor 10.5 a uma variável do tipo int.
Você pode ainda, trabalhando com diferentes pacotes de aplicações encontrar tipos de Exceptions específicos de uma determinada aplicação. Indo ainda além, você pode desenvolver sua própria classe herdando a classe Exception, para executar determinadas operações caso sua aplicação gere um erro inesperado.
Resumos Geral
Entendemos como fazer o tratamento de situações inesperadas em nosso código, a sintaxe necessária e vimos alguns tipos mais comuns de exceções encontradas mundo a fora. Ter esse entendimento a respeito das exceções é fundamental para fazer um código a prova de bugs.
コメント