Linguagens de Programação Conceitos e Técnicas Exceções Prof. Isabel Cafezeiro isabel@dcc.ic.uff.br 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.
Linguagens de Programação 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
Linguagens de Programação 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
Linguagens de Programação 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; Programa usuário, que implementa a funcionalidade. O tratador é chamado no local da ocorrência. Tratador da exceção prevista Exceções Linguagens de Programação
Linguagens de Programação 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;} 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 Exceções Linguagens de Programação
Linguagens de Programação 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
Linguagens de Programação 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
Linguagens de Programação 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
Linguagens de Programação 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
Linguagens de Programação 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
Linguagens de Programação 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
Linguagens de Programação 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
Linguagens de Programação 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
Linguagens de Programação 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 definidas pelo programador estendem esta classe Exceções Linguagens de Programação
Linguagens de Programação Exceções Em Java: A exceção definida pelo programador public class DivisaoPorZero extends Exception { //public String info; public DivisaoPorZero(String i) //info=i; } Texto emitido pelo método sinalizador da exceção Exceções Linguagens de Programação
Linguagens de Programação 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
Linguagens de Programação Exceções Em Java: O método sinalizador class Fracao { private int num,den; //numerador, denominador .... public Fracao divisao(Fracao j) throws DivisaoPorZero { Fracao g; if (j.den==0) throw new DivisaoPorZero("Na classe Fracao"); g=new Fracao(num*j.den,den*j.num); return g; } ... Sinalização Na ocorrência da exceção, a execução não chega neste ponto. Exceções Linguagens de Programação
Linguagens de Programação 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
Linguagens de Programação 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
Linguagens de Programação Exceções Na classe Fração, o método divisão sinaliza a exceção. A execução do método sinalizador (divisão) é interrompida. A execução deste bloco é interrompida. Estas linhas não serão efetuadas. O tratamento é efetuado. A retomada ocorre nos comandos seguintes ao tratador. Em Java: O tratador, no método chamador try { d=a.divisao(b); System.out.print(“Divisao de a por b: "); d.mostra(); d=a.divisao(c); System.out.print(“Divisao de a por c: "); } catch(DivisaoPorZero minhaexcecao) { System.out.println("Nao posso dividir por zero"); System.out.println("Fim da execucao!!!"); } } // fim do método, fim da classe Exceções Linguagens de Programação