Linguagens de Programação Conceitos e Técnicas Exceções Prof. Isabel Cafezeiro [email protected] http://www.dcc.ic.uff.br/~isabel *Adaptação das transparências do professor Flávio Varejão Utilizando exemplos de Tutorial Java. André Augusto Cesta. Unicamp 1996. Exceções Evento ocorrido durante a execução de um programa, que desvia o fluxo normal de instruções Condições anormais no comportamento do software, que muitas vezes não podem ser detectadas na compilação Exemplos Divisão por zero; Falha na abertura de arquivo; Fim de arquivo; Overflow; Acesso a índice inválido; Uso de objeto não inicializado. Exceções Linguagens de Programação 2 Exceções Linguagens sem mecanismo de tratamento de exceções: Ausência de ações de tratamento: software inseguro Ações de tratamento inseridas no código: software obscuro Tratamento Local • testar cada possível exceção no local provável de sua ocorrência e realizar o tratamento imediato. Tratamento não local • sinalizar código de erro em variável global específica, parâmetro específico ou retorno de função. • uso de sinalizadores da biblioteca padrão Exceções Linguagens de Programação 3 Exceções Tratamento local em C: int divideInteiros (int num, int den) { if (den == 0) trata_divisao_por_zero(); else return num/den; } int trata_divisao_por_zero(void) printf(“Divisão por zero”); return 1; } Exceções { Linguagens de Programação Programa usuário, que implementa a funcionalidade. O tratador é chamado no local da ocorrência. Tratador da exceção prevista 4 Exceções Tratamento não local em C: int funcionalidade (int x) { if (condição1(x)) return 1; if (condição2(x)) return 2; if (condição3(x)) return 3; executafuncionalidade(x); } void g( ) { int erro; erro := funcionalidade(7); if (erro == 1) trata1; if (erro == 2) trata2; if (erro == 3) trata3;} Exceções Programa usuário, que implementa a funcionalidade Condições de exceção previstas Código que implementa a funcionalidade Função que permite o tratamento, após o retorno do código onde ocorreu a exceção Tratadores de exceção Linguagens de Programação 5 Exceções Tratamento não local em C: Uso de variáveis globais da biblioteca padrão errno: variável global que guarda o código do erro Uso de sinais da biblioteca padrão raise: função que gera um sinal quando ocorre um comportamento anormal no programa. overflow: função que gera um sinal quando ocorre um acesso indevido à memória. signal: função que permite o tratamento destes eventos. setjmp,longjmp: funções que salvam e recuperam o estado do programa. longjmp desvia a execução para o local do último setjmp. Exceções Linguagens de Programação 6 Exceções Tratamento não local em C: O usuário pode desconhecer a existência da variável errno e esquecer de implementar o tratador. Pode ocorrer uma exceção para a qual o usuário não previu tratamento. Soluções baseadas em sinais são complexas. Exceções Linguagens de Programação 7 Exceções Ações de tratamento inseridas no código: Baixa legibilidade: funcionalidade básica versus condições eventuais. Nem sempre se pode prever todas as possíveis exceções. Algumas exceções não podem ser tratadas localmente. Exceções Linguagens de Programação 8 Exceções Linguagens com mecanismo de tratamento de exceções: Tratar exceções sem sobrecarregar o programa. Modularizar e reutilizar o código dos tratadores. Poupar o usuário de memorizar todas as possíveis exceções. Exceções Linguagens de Programação 9 Exceções Ações envolvidas no tratamento de exceções: 10) Sinalizar (levantar, jogar): suspender o bloco ativo, e ... ... passar a identidade da exceção para o tratador mais próximo Modos: Automático: em qualquer ponto do programa Explícito: dentro de bloco específico Exceções Linguagens de Programação 10 Exceções Ações envolvidas no tratamento de exceções: 20) Tratar: Executar o código que implementa as ações corretivas (tratador). Fica a cargo do programador: Implementar o tratador. Fica a cargo da linguagem: Fornecer o mecanismo de identificação da exceção. Gerenciar a ocorrência da exceção. Exceções Linguagens de Programação 11 Exceções Ações envolvidas no tratamento de exceções: 30) Propagar: Quando não há tratador para a exceção ocorrida no bloco onde ocorreu ... ... ela se propaga para o bloco mais externo, e daí,... ... se propaga pela cadeia dinâmica ... ... até que seja encontrado o tratador ou a função principal. Exceções Linguagens de Programação 12 Exceções Ações envolvidas no tratamento de exceções: 40) Retomada da Execução: Retomada: O controle volta para o local onde ocorreu a exceção. Terminação (quando há propagação da exceção): São desempilhados os registros de ativação do bloco onde ocorreu a exceção até o bloco onde ocorreu o tratamento. A execução prossegue na unidade onde o tratador foi encontrado, após a região do tratamento. Exceções Linguagens de Programação 13 Exceções Em Java: Nem sempre é possível programar sem exceções: Alguns métodos de classes definidas na linguagem podem gerar exceções. Neste caso, o usuário da classe tem de programar o tratador. Exceções são objetos em Java: Throwable Error Exception Exceções Exceções definidas pelo programador estendem esta classe Linguagens de Programação 14 Exceções Em Java: A exceção definida pelo programador public class DivisaoPorZero extends Exception { //public String info; public DivisaoPorZero(String i) Texto emitido { pelo método //info=i; } } Exceções sinalizador da exceção Linguagens de Programação 15 Exceções Em Java: A Sinalização em Java: O método capaz de sinalizar a exceção possui a cláusua throw em seu cabeçalho. Na ocorrência da condição anormal, este método é interrompido e o controle passa ao método chamador. Deverá existir um tratador no método chamador, ou na cadeia dinâmica. Exceções Linguagens de Programação 16 Exceções Em Java: O método sinalizador class Fracao { private int num,den; //numerador, denominador .... public Fracao divisao(Fracao j) throws DivisaoPorZero { Sinalização Fracao g; if (j.den==0) throw new DivisaoPorZero("Na classe Fracao"); g=new Fracao(num*j.den,den*j.num); Na ocorrência da return g; exceção, a execução } não chega neste ponto. ... } Exceções Linguagens de Programação 17 Exceções Em Java: O tratador em Java: try { .... } catch ( C o) { ... } Trecho de código onde possivelmente ocorrerá a exceção Classe e identificador da exceção Código tratador Exceções Linguagens de Programação 18 Exceções Em Java: O tratador, no método chamador class Principal { public static void main(String args[]) { Fracao a,b,c,d; a=new Fracao(5,3); b=new Fracao(4,2); c=new Fracao(6,0); System.out.print("Esta e' a fracao a: "); a.mostra(); System.out.print("Esta e' a fracao b: "); b.mostra(); System.out.print("Esta e' a fracao c: "); c.mostra(); Exceções Linguagens de Programação 19 Exceções Em Java: O tratador, no método chamador Na classe Fração, o método divisão sinaliza a exceção. try { d=a.divisao(b); A execução do método System.out.print(“Divisao de a por b: "); sinalizador (divisão) é d.mostra(); interrompida. d=a.divisao(c); System.out.print(“Divisao de a por c: "); A execução deste bloco d.mostra(); é interrompida. Estas } linhas não serão catch(DivisaoPorZero minhaexcecao) { efetuadas. System.out.println("Nao posso dividir por zero"); O tratamento é efetuado. } System.out.println("Fim da execucao!!!"); A retomada ocorre nos } } // fim do método, fim da classe comandos seguintes ao Exceções Linguagens de Programação tratador. 20