Exceções

Propaganda
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
Download