quarta-feira, junho 09, 2010

Tratamento de exceções - Java 7

No Java 7 será possível tratar vários tipos de exceções em um mesmo bloco "catch". Isso elimina algum código repetitivo. Vou dar um exemplo com o método "verify" de java.security.cert.Certificate, que lança "apenas" 5 tipos de exceções. O método verify1 abaixo está codificado da maneira antiga (uma cláusula catch para cada tipo). O método verify2 está codificado à la Java 7, ou seja, as exceções podem ser agrupadas usando-se a sintaxe:

catch (final Excecao1 | Excecao2 | Excecao3 ... | ExcecaoN ex)

O motivo de se exigir "final" é que a variável ex tem um tipo que é da superclasse de todas as exceções citadas, e essa variável não pode ser alterada, por exemplo, atribuindo-se a ela uma exceção de uma outra classe qualquer. Em vez disso, para simplificar, os projetistas da linguagem escolheram impor que se usasse "final".

import java.security.PublicKey;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.security.NoSuchProviderException;
import java.security.SignatureException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;

class TesteExcecoes { 
// Código pré-Java 7 
public static void verify1 () {
        Certificate cert = null;
        PublicKey key = null;
        
        try {
            cert.verify (key);
        } catch (CertificateException ex) {
            System.out.println ("Certificado inválido");
        } catch (NoSuchAlgorithmException ex) {
            System.out.println ("Não pode ocorrer");
        } catch (InvalidKeyException ex) {
            System.out.println ("Erro na chave ou na assinatura");
        } catch (NoSuchProviderException ex) {
            System.out.println ("Não pode ocorrer");
        } catch (SignatureException ex) {
            System.out.println ("Erro na chave ou na assinatura");
        }
    } 
// Código Java 7 - note o uso de "final" e "|" 
public static void verify2 () {
        Certificate cert = null;
        PublicKey key = null;
        try {
            cert.verify (key);
        } catch (CertificateException ex) {
            System.out.println ("Certificado inválido");
        } catch (final NoSuchAlgorithmException | NoSuchProviderException ex) {
            System.out.println ("Não pode ocorrer");
        } catch (final InvalidKeyException | SignatureException ex) {
            System.out.println ("Erro na chave ou na assinatura");
        }
    }
    public static void main (String[] args) {
        verify1();
        verify2();
    }
}

Usei o build 95 do Java 7. Pegue o build mais recente, disponível em http://download.java.net/jdk7/ .