sábado, 5 de janeiro de 2013

Tratamento de exceções

Vamos verificar alguns pontos do tratamento de exceções no Java. O primeiro tópico que vou tratar neste post é a diretiva assert. Ela é utilizada para nos permitir gerar paradas na execução do programa baseado em uma condição booleana. Esta diretiva existe desde a versão 1.4 do Java. Este recurso permite que testemos alguma pré suposição durante o desenvolvimento ter que escrever manipuladores para exceções que provavelmente não ocorrerão quando o programa tiver saído da fase de desenvolvimento.

As assertivas permitem que você teste suas suposições durante a fase de desenvolvimento.

A estrutura do comando é

assert Expressao_booleana : método_não_void;


Como por exemplo:

assert (boolean) : string;


O comando funciona da seguinte maneira: o valor (boolean) deve ser sempre verdadeiro. Quando este valor for avaliado como falso, é gerado uma exceção tipo AssertionError.

Por padrão, assert vem desabilitado. Para desfrutar do recurso é necessário ativá-lo. Os passos são:

1.Colocar as clausulas assert nos locais desejados no nosso programa

2.Compilar as classes (devemos solicitar que a compilação seja feita para uma versão superior a 1.4)

javac -source 1.5 classe.java

3.Habilitar o uso de assert durante a execução utilizando um dois dois parâmetros do java

java –ea classe
java –enableassertions classe

Para desabilitar as assertivas usamos os parâmetros

java –da classe
java –disableassertions classe

Regras de uso assert:
  • Assert não pode ser usado no lugar do IF
  • Assert não pode testar métodos públicos ou argumento digitado pelo usuário
  • Não pode apresentar efeitos colaterais no programa, ou seja, o seu programa deve rodar tanto com ele habilitado ou não.
Como recomendação nós devemos utilizar assert quando escreveríamos um comentários por exemplo em uma cláusula if-then-else. Vamos ver um exemplo abaixo:

    if (i % 3 == 0) {
        ...
    } else if (i % 3 == 1) {
        ...
    } else {
        assert i % 3 == 2 : i;
        ...
    }


Note que esperamos que (i % 3) na última cláusula else sempre dê 2. Porém como o operador % não opera módulo, podemos eventualmente um valor negativo, que não estamos esperando neste local. Com isto uma exceção AssertionError pode ser utilizada.

Outro local onde poderíamos utilizar assert é em declarações switch...case sem cláusula default. A inexistência de uma cláusula default não é recomendada, mas vamos dizer que acreditamos que testamos os pontos cardeiais como no switch abaixo:

switch (direcao) {
  case PontoCardeal.NORTE:
    ....
    break;
  case PontoCardeal.SUL:
    ....
    break;
  case PontoCardeal.LESTE:
    ....
    break;
  case PontoCardeal.OESTE:
    ....
    break;
}

se a variável direcao for do tipo Enum PontoCardeal nunca teremos necessidade de uma cláusula default. Uma alteração possível é a colocação da seguinte cláusula default.

  default:
    throw new AssertionError(suit);



Se a variável aceitar um quinto valor, será gerada uma exceção AssertionError.

Nenhum comentário:

Postar um comentário