Anda di halaman 1dari 53

TRATAMENTO DE EXCEES

(baseado em transparncias do prof. Ulysses de Oliveira)

Prof. Ricardo Linden

Excees
Situaes que impedem o funcionamento normal de um programa

Exemplos:
Tentativa de abertura de um arquivo inexistente Execuo de uma operao ilegal (e.g., diviso por zero)

Excees
Formas rudimentares de tratamento de excees numa funo em C:
Abortar programa usando abort(): muito radical Retornar um valor indicando o erro

Exemplo em C:
if (UmaFuncao() == VALOR_DE_ERRO) /* Tratamento de erro */ else /* Programa prossegue normalmente */
3

Excees
Problemas (C): Cada chamada de funo que pode gerar uma exceo deve ser testada prejudicando a legibilidade Nem sempre o programador checa o valor retornado

Nem sempre uma funo pode retornar um valor indicando erro (e.g., uma funo que pode retornar qualquer valor do tipo int ou bool)
Construtores e blocos retornam nenhum valor de inicializao no

Excees em Java
Resposta a uma circunstncia excepcional que surge enquanto o programa est sendo executado.

Forma de transferir o controle do programa de uma parte do programa que gera um erro para outra parte do programa que faz o tratamento adequado de erros. Vantagem do mecanismo: no necessrio checar valores de retorno de mtodos a cada chamada
Componentes:

Lanador de exceo
Tratador de exceo
5

Lanador de Excees
Usado quando o problema (exceo) aparece Essencialmente, um desvio para um conjunto de instrues Usa a palavra-reservada throw seguida por um objeto de uma classe de exceo indicando a natureza da exceo

Veremos mais sobre o lanador mais frente. Agora vamos nos concentar nos casos em que o Java lana as excees automaticamente
6

Tratamento de excees
Forma de dividir o programa em duas sees: Casos normais e casos excepcionais Usando tratamento de excees, podemos implementar nossos programas de forma incremental

Escreva e depure o cdigo para operao normal primeiro


Adicione o cdigo para os casos excepcionais depois. Simplifica o desenvolvimento, teste, depurao e manuteno Erros so mais facilmente isolados.
7

Terminologia
Lanar (Throw)uma exceo : ou o Java ou o seu programa sinalizam que algo de errado aconteceu.

Tratamento de exceo: a resposta a uma exceo atravs da execuo de uma parte do programa especialmente escrita para esta exceo tambm exceo chamada de interceptao (catch) de

O caso normal tratado no bloco try enquanto que o caso excepcional tratado no bloco catch

Idia Bsica
Ns tentamos (try) executar um fragmento de cdigo que pode gerar uma exceo Se uma exceo ocorrer ns a capturamos (catch), passando a executar um cdigo de tratamento da exceo.

Ao fim da execuo (finally), ns executamos cdigo de trmino.


9

Bloco try
Bloco de instrues no qual algumas excees podem ser lanadas Usa palavra-reservada try seguido de um bloco de instrues entre chaves Chamadas de mtodos que no lanam excees podem (mas no precisam) ser colocadas dentro de blocos try Quando uma exceo lanada, cada objeto criado dentro do bloco try at o ponto de lanamento liberado Sintaxe:

try { <Instrues que podem lanar excees>; }

10

Bloco catch
Tratador de exceo: captura excees

O bloco catch recebe um parmetro da classe Exception


chamado de parmetro do bloco catch e um nome parmetro normalmente usado para

este

Se uma exceo lanada durante a execuo de um bloco try este imediatamente termina e o controle passa para o bloco catch apropriado

11

Bloco catch
Sintaxe:

catch(<classe de exceo> <argumento>) { <instrues>; }


Onde: <classe de exceo> classe de exceo que o tratador pode capturar e <argumento> um identificador que armazena o valor da exceo lanada

12

Bloco catch
Pode haver vrios blocos catch seguindo um bloco try Vrios tipos de excees so possveis em um bloco.

Um para cada tipo de exceo :


a escolha do apropriado feita de forma parecida ao bloco case

O bloco catch que casa com alguma exceo lanada tem suas instrues executadas

Se nenhuma exceo lanada, todos os blocos catch so saltados Um bloco catch com argumento da classe Exception executado com o lanamento de qualquer exceo; por isso, se ele existir, ele deve ser o ltimo bloco 13 catch

Mltiplos blocos catch


Vrios tipos diferentes de excees podem ser lanadas.

Os blocos catch que seguem imediatamente o bloco try so varridos em seqncia por uma exceo que seja do tiop da lanada.

O primeiro bloco que lidar com uma exceo do tipo da lanada o nico a ser executado. Excees especficas so derivadas de tipos mais gerais.

Tanto as gerais quanto as especficas lidaro com as excees do tipo mais especfico.

14 Logo, o bloco catch das mais gerais devem ser colocados deopis dos das mais especficas.

Lembrando de hierarquia de classes


Object

Throwable

Uma exceo da classe FileNotFoundException tambm pertence classe IOException e classe Exception. Logo um catch de qualquer uma destas duas tambm intercepta a mais baixa na hierarquia.

Exception

IOException

FileNotFoundxception

15

Bloco catch
Excees no interceptadas podem causar o trmino prematuro do programa

16

Mais sobre o bloco catch

Apesar de parecer com uma definio de mtodo, o bloco catch no o . Toda Exception tem um mtodo getMessage

Recupera a string dada ao objeto de exceo quando ela foi lanada. Um bloco catch aplicvel apenas para o bloco try que o precede Se nenhuma exceo lanada, o bloco catch ignorado.

17

Bloco finally
Pode-se especificar um bloco finally que sempre executado quando uma exceo lanada ou no.

O bloco finally deve vir aps o ltimo bloco catch


Usado para liberar recursos que no podero ser usados devido ocorrncia da exceo Sintaxe:

finally { <instrues>; }
18

Trs possibilidades usando-se finally


O bloco try executa sem problemas e nenhuma exceo lanada. Neste caso o bloco finally executa logo aps o bloco try.

Uma exceo lanada aps o bloco try e interceptada em um bloco catch. O bloco finally executa aps o bloco catch.

Uma exceo lanada e no h um bloco catch capaz de intercept-la.


O bloco finally executado antes do fim do mtodo O cdigo que est depois dos blocos catch mas no dentro do 19 bloco finally-no executado nesta situao

Exemplo
import javax.swing.JOptionPane;
public class Excecao1 { static int divide( int numerador, int denominador ) throws ArithmeticException { return numerador / denominador; } public static void main( String args[] ) { String strEntrada; int num,denom, resultado; try { strEntrada = JOptionPane.showInputDialog( num = "Introduza um numerador inteiro: "); Integer.parseInt(strEntrada); "Introduza um denominador inteiro: ");

strEntrada = JOptionPane.showInputDialog(

denom = Integer.parseInt(strEntrada);
resultado = divide( num, denom ); JOptionPane.showMessageDialog(null, "Resultado = " + resultado); }
20

Exemplo (Cont.)
// Captura exceo lanada devido a erro de formao de uma entrada
catch ( NumberFormatException exceo1 ) { JOptionPane.showMessageDialog( null, "Erro: Voc no introduziu um nmero inteiro."); } // Captura exceo lanada devido a diviso por zero catch ( ArithmeticException arithmeticException ) { JOptionPane.showMessageDialog( null, "Erro: Tentativa de diviso por zero."); } catch ( Exception e ) { JOptionPane.showMessageDialog( null, } finally { JOptionPane.showMessageDialog( null, "Execuo do bloco finally."); "Erro genrico.");

System.exit( 0 );
} } }
21

Sada do Programa
Se o usurio introduzir algo que no pode ser traduzido como um inteiro, o programa responder: Erro: Voc no introduziu um nmero inteiro. Se o usurio introduzir 0 como segundo valor inteiro, o

programa responder: Erro: Tentativa de diviso por zero. Caso contrrio, o programa apresentar o resultado da diviso inteira do primeiro nmero pelo segundo. Antes de encerrar, o programa imprime: Execuo do bloco finally.

22

Aninhamento de Blocos try


Blocos try podem ser aninhados

Pode-se utilizar throw para relanar uma exceo de um bloco catch interno para um bloco try externo
Se alguma instruo dentro de um bloco catch lanar uma exceo, esta ser tratada num bloco try externo (se este existir)

23

Aninhamento de Blocos try


Exemplo:
try { try { ... } catch (ClasseDeExceo erro1) { ... throw erro1; //Relana exceo para try externo } ... } catch (ClasseDeExceo ex) { ... }
24

Lanando nossas prprias excees


Caso queiramos causar um erro em nossos programas, podemos usar a clusula throw.

25

Bloco try-throw-catch
Esqueleto bsico do cdigo:

try{ <cdigo a realizar> if(condio) throw new Exception(<mensagem>); <mais cdigo> } catch(Exception e) { <cdigo de tratamento de excees> }
<resto do cdigo>
26

Execuo de try-throw-catch
Bloco Try

As Statements executam at o teste da condies do bloco que contm o throw. Se a condio verdadeira, a exceo lanada.

O controle passa ento para um dos blocos do catch aps o try. Se a condio for falsa A exceo no lanada.

O resto das instrues do try executado

27

Execuo de try-throw-catch
Bloco Catch Executa se a exceo lanada. Pode terminar a execuo com um statement exit. Se no terminar, a execuo continua aps o bloco catch. Statements aps o bloco Catch Executam se no lanada uma exceo ou se lanada e o catch no faz um exit.

28

Exemplo de try-throw-catch
try { System.out.println("Enter number of donuts:"); donutCount = SavitchIn.readLineInt();

ExceptionDemo try and catch blocks

System.out.println("Enter number of glasses of milk:"); milkCount = SavitchIn.readLineInt(); if (milkCount < 1) throw new Exception("Exception: No Milk!");

bloco try
statement throw
}

donutsPerGlass = donutCount/(double)milkCount; System.out.println(donutCount + " donuts."); System.out.println(milkCount + " glasses of milk."); System.out.println("You have " + donutsPerGlass + " donuts for each glass of milk.");

bloco catch

catch(Exception e) { System.out.println(e.getMessage()); System.out.println("Go buy some milk."); System.out.println("Program aborted."); System.exit(0); }

29

Lanamento de Excees em Construtores


Construtores tambm podem lanar excees

Quando um construtor lana uma exceo, o objeto ora sendo construdo liberado (i.e., marcado para coleta de lixo)

nica maneira de tratar problemas, pois construtores no retornam valores que possam ser testados.

30

Hierarquia de Classes de Excees


Excees so objetos como quaisquer outros, logo pertencem a classes.

Estas so classes como quaisquer outras, podendo ser derivadas para criar classes prprias, por exemplo.
Throwable

Exception

Error

RuntimeException

IOException

AWTError

ThreadDeath

OutOfMemoryError

31

Hierarquia de Classes de Excees


Classe Throwable: base da hierarquia de excees. Fornece os seguintes mtodos que sempre podemos usar: Mtodo printStackTrace: imprime a seqncia de chamadas de mtodos at o lanamento da exceo Mtodo getStackTrace: retorna informaes sobre a pilha de execuo Mtodo getMessage: retorna a (string) associado com a execeo mensagem

32

Exemplo
public class Excecao4 {
public static void main( String args[] ) { try { Mtodo1(); } catch ( Exception ex ) { System.err.println( ex.getMessage() + "\n" ); ex.printStackTrace(); // Obtm informaes sobre a pilha de execuo StackTraceElement[] elementos = ex.getStackTrace();

System.out.println( "\n\t\tTrace da Pilha:\n" ); System.out.println( "Classe\t\tArquivo\t\tLinha\tMtodo" );


// Obtm descrio de cada elemento do trace for ( int i = 0; i < elementos.length; i++ ) { StackTraceElement elemento = elementos[ i ]; System.out.print( elemento.getClassName() + "\t" ); System.out.print( elemento.getFileName() + "\t" ); System.out.print( elemento.getLineNumber() + "\t" ); System.out.print( elemento.getMethodName() + "\n" ); } } }
33

Exemplo (Cont.)
// Chama Mtodo2 e lana exceo para main public static void Mtodo1() throws Exception { Mtodo2(); }
// Chama Mtodo3 e lana exceo para Mtodo1 public static void Mtodo2() throws Exception { Mtodo3(); } // Lana exceo para Mtodo2 public static void Mtodo3() throws Exception { throw new Exception( "Exceo lanada por Mtodo3" ); } }

34

Resultado do Programa

35

Hierarquia de Classes de Excees

Subclasse Exception: de onde normalmente so derivadas classes de excees definidas pelo programador

Subclasse Error: excees raramente capturadas. Maioria relativa a questes de sistema operacional/ambiente.

36

Classes de Excees Definidas pelo Programador


Podem ser derivadas de qualquer subclasse da classe Throwable, mas normalmente so derivadas da classe Exception ou de subclasses desta ltima classe Qualquer exceo de classe derivada de uma classe especificada numa clusula catch capturada por esta clusula Se uma classe de exceo derivada de outra e ambas capturadas em clusulas catch associadas a um mesmo bloco try, ento o bloco catch da classe derivada deve preceder o bloco catch da superclasse

37

Classes de Excees Definidas pelo Programador


public class DivideByZeroException extends Exception { public DivideByZeroException() { super("Dividindo por Zero!"); } public DivideByZeroException(String message) { super(message); } }

Deve estender uma classe de exceo pr-existente Normalmente s definimos o mtodo construtor. Inclua um construtor que receba uma string como 38 arqumento e um sem argumento que chame o super com uma mensagem padro.

Quando definir sua prpria exceo

Quando voc usa uma statement throw no seu cdigo, bom definir sua prpria exceo.

Se voc usar uma exceo pr-definida mais geral, seu blococatchtem que ser mais geral tambm e interceptar outras excees lanadas por outros.

Criando a sua, seu bloco catch especfico interceptar sua exceo e deixar as outras passarem e serem tratadas por outrm.

39

Exemplo (1/2)
import javax.swing.JOptionPane; class DividePorZero extends ArithmeticException { public DividePorZero() { super("Tentativa de diviso por zero."); } public DividePorZero(String mensagem){ super(mensagem); } } public class Excecao2 { // Lana uma exceo quando ocorre uma diviso por zero static int divide( int numerador, int denominador ) throws DividePorZero { if (denominador == 0) throw new DividePorZero(Tentou dividir por zero."); return numerador / denominador; }

40

Exemplo (2/2)
public static void main( String args[] ) { String strEntrada; int num,denom, resultado; try { strEntrada=JOptionPane.showInputDialog("Numerador: "); num = Integer.parseInt(strEntrada); strEntrada = JOptionPane.showInputDialog("Denominador: "); denom = Integer.parseInt(strEntrada); resultado = divide( num, denom ); JOptionPane.showMessageDialog(null, "Result= " + resultado); } catch (DividePorZero ex) { JOptionPane.showMessageDialog( null,"Erro:"+ ex.toString()); } catch ( ArithmeticException arithmeticException ) { JOptionPane.showMessageDialog( null, "Erro em operao aritmtica."); } finally { System.exit( 0 ); }

41

Classes de Excees Definidas pelo Programador


Nota: se forem trocada a ordem das clusulas catch (ArithmeticException e) e catch (DividePorZero ex), o compilador indicar um erro de sintaxe

42

Excees Verificadas
Uma mtodo pode ser qualificado para indicar os tipos de excees que ele pode lanar Sintaxe (ao final do cabealho da mtodo):

throws <Classe 1>, ..., <Classe N>

43

Excees Verificadas
Observaes: Um mtodo pode lanar objetos das classes especificadas ou de subclasses Se um mtodo predomina outro (overriding), ele no pode especificar alm daquelas especificadas no mtodo predominado

Se um mtodo possui especificao de excees, ele s pode ser chamado dentro de bloco try com um bloco catch correspondente para cada tipo de exceo que o mtodo pode lanar

44

Throws em classes derivadas

No podemos acrescentar clusulas throws em mtodos que predominam sobre outros da superclasse.

S as excees j definidas no mtodo da superclasse podem ser especificados na classe derivada.

Podemos entretanto definir menos excees do que aquelas especificadas no mesmo mtodo na superclasse

45

Excees No-verificadas
Lanadas automaticamente por Java Derivadas da classe RuntimeException ou Error No precisam (mas, podem) ser especificadas usando throws

46

Excees No-verificadas
Exemplo: Tentar acessar um elemento de um arranjo fora dos limites do mesmo O programador no precisa se preocupar em lanar uma exceo quando isto ocorre Java lana automaticamente uma exceo do tipo ArrayIndexOutOfBoundsException

47

Excees Verificadas
No so lanadas automaticamente Derivadas de classes de excees que no derivadas de RuntimeException Devem ser especificadas usando throws Se um mtodo chama outro mtodo que lana excees verificadas, estas excees devem ser especificadas na clusula throws do mtodo que faz a chamada, a no ser que este mtodo capture esta exceo

48

Interceptando excees fora do mtodo que a lana


Quando definir um mtodo voc deve incluir uma clusula throws para declarar todas as excees que podem ser lanadas mas no iterceptadas por aquele mtodo.

Use a clusula throws para dizer que a responsabilidade de tratar os problemas dos mtodos que chama este mtodo.

Isto diz para outros mtodos: se voc quiser usar meus serios, ento tem que tratar minhas excees

49

Exemplo: Clasula throws


Seja a classe DoDivision

Ele pode lanar a exceo DivideByZeroException no seu mtodo normal

Mas ela no intercepta o erro (o bloco catch fica na classe chamadora)

Logo, o mtodo normal deve incluir uma clsula throws na primeira linha de sua definio

public void normal() throws DivideByZeroException { <statements de operao do mtodo > }


50

Mais sobre passar a responsabilidade


Toda exceo lanada tem que ser eventualmente interceptada.

Normalmente as excees so interceptadas em um bloco catch ou deferidas para tratamento posterior usando-se a clusula throws

Se o mtodo lana uma exceo ele espera encontrar uma bloco catch correspondente dentro dele, a no ser que ele possua uma clusula throws

Se o mtodo chamador tambm tiver uma clusula throws da mesma classe, ele pode deferir o tratamento, mas algum, em algum momento tem que tratar aquela exceo.
51

Excees no interceptadas

Em qualquer mtodo podemos interceptar algumas excees e deferir o tratamento de outras

Se uma exceo no interceptada em nenhum mtodo da hierarquia de chamadas ento: o programa termina ou

se o programa usa Swing, ele pode continuar mas tornar-se instvel.

As classes Error e RunTimeError no devem ter um bloco catch ou uma clusula throws Elas parecem excees mas no o so.
52

Organizao tpica do tratamento de excees


MethodA lana MyException mas deixa outros tratarem a exceo. (usando a clusula throws)

public void MethodA() throws MyException { throw new MyException("Bla Bla Bla"); }

MethodB, que chama o MethodA, intercepta as excees da classe MyException

public void MethodB() { try { MethodA();//May throw MyException exception } catch(MyException e) { <statements to handle MyException exceptions> } } 53
53

Chapter 8

Anda mungkin juga menyukai