Início‎ > ‎

Usar os mecanismos de tratamento de exceções

Quando um erro ou uma situação imprevista acontece durante a execução de um método, o método chamador deve ser avisado. Este aviso era tradicionalmente feito através do retorno de códigos de erro, mas as linguagens de programação modernas, como Java, incluem elementos chamados exceções, cujo objetivo é sinalizar situações de exceção: erros ou outros imprevistos que afetem o bom funcionamento do sistema.

Em Java, as situações imprevistas são sinalizadas pelo uso de objetos das subclasses de java.lang.Throwable: Error ou Exception. A classe java.lang.Error sinaliza uma condição anormal séria, que a aplicação não terá condições de tratar e é normalmente usada para sinalizar as condições de erro da máquina virtual Java. Já java.lang.Exception sinaliza uma condição excepcional que deve ser tratada pela aplicação. O código abaixo demonstra como funciona o tratamento de exceções em Java:

Try {
  …
  throw y;
  Try {
    throw e;
  }
  catch (Exception e) {…}

  …
  throw z;
}
catch (Exception y) {…}
catch (Exception z) {…}

O tratamento de exceções em Java consiste de blocos try...catch e comandos throw. Sempre que houver a possibilidade de uma exceção ser levantada através de um comando throw ou da chamada a um método que lance uma exceção, este código deve fazer parte de um bloco try ou passar a exceção adiante, declarando o método conforme o exemplo abaixo:

public void writeList() throws IOException{...}

Esta declaração informa ao compilador que o método pode lançar exceções que devem ser tratadas por seus chamadores (neste caso o método pode lançar exceções do tipo java.io.IOException).

Java apresenta um tipo especial de exceção, declarada como subclasse de java.lang.RuntimeException. Estas exceções diferem das demais pois não obrigam o método a definir nem um bloco try-catch e também não precisam constar da lista de exceções declaradas na assinatura do método através da cláusula throws. O uso de RuntimeException pode prejudicar a confiabilidade de uma aplicação, pois, como o compilador não obriga que sejam tratadas de maneira explícitas, estas exceções podem passar desapercebidas pelos programadores. Assim, a aplicação pode acabar abortando sua execução se uma exceção deste tipo for levantada e não tiver sido tratada.

Quando as exceções usadas não são do tipo Runtime, estas devem explicitamente declaradas ou tratadas por cada método, evitando que erros previsíveis ou banais venham a afetar a confiabilidade de aplicação. Desta forma recomenda-se que todas as condições de exceção de um programa sejam sinalizadas através dos mecanismos de tratamento e exceções de Java e, mais ainda, que não sejam usadas exceções do tipo Runtime, exceto nos seguintes casos (e desde que haja ampla documentação da exceção e dos motivos para que esta seja do tipo Runtime):

  1. Quando um método detectar um erro da máquina virtual Java. Entretanto o ideal seria esperar que a própria máquina virtual lançasse um Error ou Exception.
  2. Quando o programador tiver certeza que os desenvolvedores das classes chamadoras têm total conhecimento das restrições da sua classe. Por exemplo, a exceção ArrayIndexOutOfBoundsException poderia ser do tipo Runtime, já que podemos assumir que os programadores têm plena consciência dos problemas relacionados à inserção de elementos além dos limites de um vetor.
  3. Se a exceção for tratada, com certeza, dentro da própria classe ou do componente a que esta classe pertence. Neste caso deve-se garantir que não há possibilidade de exceção se propagar para fora do componente em hipótese alguma.
  4. Quando o custo de tratar a exceção a cada chamada do método for considerado muito alto. Se um método é chamado com muita freqüência, o custo de verificar se foi lançada uma exceção a cada chamada pode se tornar proibitivo.

Em hipótese alguma devem ser usadas exceções do tipo Runtime apenas para evitar o trabalho de ter de usar blocos try...catch

Comments