Propagando exceções

Embora toda exceção deva ser tratada, nem sempre é possível tratar uma exceção no mesmo escopo do método cuja invocação gerou a exceção. Nessas situações, é possível propagar a exceção para um nível acima na pilha de invocações.

Para tanto, o método que está deixando de capturar e tratar a exceção faz uso da cláusula throws na sua declaração:

  void métodoQueNãoTrataExceção() throws Exception {
    invoca.métodoQuePodeGerarExceção();
  }

Nesse caso, métodoQueNãoTrataExceção() reconhece que em seu corpo há a possibilidade de haver a geração de uma exceção mas não se preocupa em realizar o tratamento dessa exceção em seu escopo. Ao contrário, ele repassa essa responsabilidade para o método anterior na pilha de chamadas.

Eventualmente, também o outro método pode repassar a exceção adiante. Porém, pelo menos no main() as exceções deverão ser tratadas.

Exemplo

A seguir, o exemplo da aquisição de um valor inteiro a partir da entrada padrão é reapresentado com o uso da cláusula throws. Nesse caso, throws tem que ser declarado em dois métodos. Primeiro no método leLinha, que invoca read() e não faz o tratamento de IOException. Segundo, no método leInt, que pode receber o IOException de leLinha mas também não faz seu tratamento. Para ilustrar, nesse segundo caso inclui-se também a declaração de que o método pode também gerar a exceção NumberFormatException.

1  import java.io.*;
2  
3  public class ConvInt3 {
4    public String leLinha() 
5  	throws IOException {
6          byte[] tB = new byte[20];
7          System.in.read(tB);
8          String taTudo = new String(tB);
9          String taLimpo = taTudo.trim();
10         return taLimpo;
11  }
12     
13  public int leInt() 
14 	throws IOException, NumberFormatException {
15         String s = leLinha();
16         return Integer.parseInt(s);
17  }
18     
19  public static void main(String[] args) {
20         ConvInt3 ci = new ConvInt3();
21         System.out.print("Entre inteiro: ");
22 	try {
23 	    int valor = ci.leInt();
24 	    System.out.println("Valor lido foi: " + valor); 
25 	}
26 	catch (IOException ioe) {
27 	    System.err.println("Erro de leitura");
28 	}
29 	catch (NumberFormatException nfe) {
30 	    System.err.println("Erro de formato");
31 	}
32  }
33 }

© Ivan Luiz Marques Ricarte
DCA/FEEC/UNICAMP

Last modified: Mon Nov 8 12:27:41 EDT 1999