47
Eiji Adachi Barbosa LES / DI / PUC-Rio Abril / 2011 Aula 15 Estrutura de Funções e Tratamento de Exceções

Aula 15 Estrutura de Funções e Tratamento de Exceções

Embed Size (px)

DESCRIPTION

Aula 15 Estrutura de Funções e Tratamento de Exceções. Eiji Adachi Barbosa LES / DI / PUC-Rio Abril / 2011. Avisos. Correção do questionário será entregue até o fim deste mês Próxima aula ( 20/abril/2011 ) haverá exercício em sala de aula valendo 1 ponto no T2 - PowerPoint PPT Presentation

Citation preview

Page 1: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Eiji Adachi Barbosa

LES / DI / PUC-Rio

Abril / 2011

Aula 15 Estrutura de Funções e Tratamento de Exceções

Page 2: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Avisos

• Correção do questionário será entregue até o fim deste mês

• Próxima aula ( 20/abril/2011 ) haverá exercício em sala de aula valendo 1 ponto no T2

– Exercício em dupla (preferencialmente, a mesma dupla dos trabalhos)

21 de abr de 2023 2Eiji Adachi Barbosa

Page 3: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Sumário

• Definições básicas

– O que é função?

– Por que / para que usar funções?

– Pilha de chamadas

• Finalização de uma função

• Função de “Arrumação da casa”

• Especificação de uma função

– Especificação do acoplamento de uma função

• Tratamento de exceções

– Em C

– Em linguagens de programação contemporâneas

21 de abr de 2023 3Eiji Adachi Barbosa

Page 4: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Definições básicas

• O que é uma função?

– Função é uma porção auto-contida de código que:

• possui um nome que pode ser chamado (ativado) de diversos lugares

• pode retornar zero ou mais valores

• pode depender de e alterar zero ou mais parâmetros

• pode alterar zero ou mais valores do estado do módulo

– variáveis internas

– variáveis globais

• pode criar, ler e destruir arquivos, etc...

TIPO_RETORNO NOME_FUNCAO ( LISTA_PARAMETROS){ CORPO_FUNCAO}

21 de abr de 2023 4Eiji Adachi Barbosa

Page 5: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Definições básicas

• Por que / para que usar funções?

– Princípio dividir para conquistar

• Dividir sistema em módulos Dividir algoritmo em funções

• Evitar códigos monolíticos

– Reuso e manutenibilidade

21 de abr de 2023 5Eiji Adachi Barbosa

Page 6: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Definições básicas - Pilha de chamadas

int main()

void firstCall()

int printf(const char *...)

int main() {

firstCall();

return 0;

}

void firstCall(){

printf("First Call\n");

secondCall();

return;

}

int secondCall(){

printf("Second Call\n");

thirdCall();

return 0;

}

char thirdCall(){

printf("Third Call\nOK, That’s enough.\n");

return '0’;

}21 de abr de 2023 6Eiji Adachi Barbosa

Page 7: Aula  15  Estrutura de Funções e  Tratamento de Exceções

int main() {

firstCall();

return 0;

}

void firstCall(){

printf("First Call\n");

secondCall();

return;

}

int secondCall(){

printf("Second Call\n");

thirdCall();

return 0;

}

char thirdCall(){

printf("Third Call\nOK, That’s enough.\n");

return '0’;

}

Definições básicas - Pilha de chamadas

int main()

void firstCall()

int secondCall()

int printf(const char *...)

21 de abr de 2023 7Eiji Adachi Barbosa

Page 8: Aula  15  Estrutura de Funções e  Tratamento de Exceções

int main() {

firstCall();

return 0;

}

void firstCall(){

printf("First Call\n");

secondCall();

return;

}

int secondCall(){

printf("Second Call\n");

thirdCall();

return 0;

}

char thirdCall(){

printf("Third Call\nOK, That’s enough.\n");

return '0’;

}

Definições básicas - Pilha de chamadas

int main()

void firstCall()

int secondCall()

char thirdCall()

int printf(const char *...)

21 de abr de 2023 8Eiji Adachi Barbosa

Page 9: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Finalização de funções

• Encerrando a execução de uma função:

– Chegar ao fim de uma função void

– O comando return <VALUE>

• Encerra a execução de uma função imediatamente

• Se um valor de retorno é informado, a função chamada (callee) retorna este valor para a função chamadora (caller)

• A transferência de controle é local, i.e., após o return o controle do fluxo de execução passa da função chamada para a função chamadora

– O comando exit(int)

• Encerra a execução do programa

– Executa em ordem reversa todas as funções registradas pela função int atexit( void (*func)(void) )

– Todos streams são fechados, todos arquivos temporários são apagados

– O controle de execução retorna ao ambiente-hospedeiro (host enviornment) o valor inteiro passado como argumento

• `

21 de abr de 2023 9Eiji Adachi Barbosa

Page 10: Aula  15  Estrutura de Funções e  Tratamento de Exceções

21 de abr de 2023 Eiji Adachi Barbosa

Finalização de funções

• Deve existir uma sub-estrutura de funções cuja raiz coordena o controle de alocação e liberação de recursos. Exemplo:pArq = AbrirArquivo( NomeArquivo ) ;if ( pArq != NULL ){ ProcessarArquivo( pArq ) ; FecharArquivo( pArq ) ;} /* if */

• Devem ser liberados todos os espaços dinâmicos e recursos alocados e que não serão retornados, ou que não foram incorporados a uma estrutura de dados ancorada durante a execução

– requer exame do código com vistas a verificar se existe algum caminho em que o espaço ou recurso perde a âncora quando a função termina a execução.

10

Page 11: Aula  15  Estrutura de Funções e  Tratamento de Exceções

21 de abr de 2023 Eiji Adachi Barbosa

Arrumação da casa: finalização do programa

• Ao terminar a execução de um programa todos os recursos alocados neste programa devem ser liberados, independentemente de como foi terminado o programa

• Exemplos:

– arquivos abertos

– memória alocada

• Deve ser restaurado estado do sistema para o que era antes de iniciar a execução do programa

• Função int atexit( void (*func)(void) )

11

Page 12: Aula  15  Estrutura de Funções e  Tratamento de Exceções

21 de abr de 2023 Eiji Adachi Barbosa

Arrumação da casa: finalização do programa

• Assegurar a liberação de recursos alocados é particularmente complexo quando o programa utiliza funções de finalização capazes de cancelar a execução

• Pode-se utilizar um módulo de arrumação da casa (housekeeping), ou de finalização para ajudar a resolver

• De qualquer maneira é necessária disciplina ao programar

12

Page 13: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Especificação de uma função

• A especificação de uma função define sua interface conceitual, em termos de:

– Objetivo da função

– Acoplamento

• Identifica todos os itens da interface

– Pré-condição (Assertivas de entrada)

– Pós-condição (Assertivas de saída)

– Requisitos

• Propriedades de desempenho a serem satisfeitas: tempo de resposta, capacidade de armazenamento...

– Hipóteses

• Windows, Linux, Mac? 32bit, 64bit?

21 de abr de 2023 13Eiji Adachi Barbosa

Próxima aula, dia 25/04.

Page 14: Aula  15  Estrutura de Funções e  Tratamento de Exceções

21 de abr de 2023 Eiji Adachi Barbosa

Especificação do acoplamento

• Acoplamento– identifica todos os itens da interface e respectivos tipos

• não somente os elementos da assinatura

– são exemplos de itens do acoplamento• parâmetros recebidos

• parâmetros modificados (chamada por referência)

• valores retornados, condições de retorno

• dados globais manipulados e/ou modificados

• arquivos manipulados

• exceções sinalizadas

• cancelamentos realizados – exit( num )

14

Page 15: Aula  15  Estrutura de Funções e  Tratamento de Exceções

21 de abr de 2023 Eiji Adachi Barbosa

Especificação do acoplamento: notação

• 1. De forma visual, tais como: modelo de componentes

– comentários podem ser usados para indicar dados resultantes ou modificados

• 2. Interface em notação similar a uma linguagem de programação

– listam-se como parâmetros todos os dados ao entrar

• independentemente se serão explícitos ou implícitos

• sem se preocupar com a forma de realizar– por exemplo: diz-se Tabela ao invés de pTabela, mesmo se fisicamente a tabela

será identificada por um ponteiro para a sua cabeça

– listam-se como saída todos os dados resultantes ou modificados

– exemplo

InserirSimbolo( tpTabela Tabela, tpSimbolo Simbolo ) tpTabela Tabela , tpIdSimb IdSimbolo ,

tpCondRet CondRet

15

Page 16: Aula  15  Estrutura de Funções e  Tratamento de Exceções

21 de abr de 2023 16 / 32Eiji Adachi Barbosa

Especificação do acoplamento: notação

• 3. Texto explanatório, separando entrada e saída

InserirSimbolo( tpTabela Tabela, tpSimbolo Simbolo ) tpTabela Tabela, tpIdSimb IdSimbolo, tpCondRet CondRet

Recebe dados Tabela - Tabela em que será inserido o símbolo Simbolo - Símbolo válido a inserirProduz resultados Se não ocorreu erro Se o símbolo era novo: Cria um idSimbolo diferente dos existentes Tabela acrescida do par < idSimbolo, Simbolo > Se o Simbolo já existia Tabela inalterada FimSe idSimbolo o id associado ao Simbolo Se ocorreu erro: Tabela inalterada idSimbolo = NIL_SIMBOLO FimSe CondRet ver tipo tpCondRetTabela

Page 17: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Tratamento de exceções

• Por que é importante tratar exceções?

– Você pode irritar o seu usuário

21 de abr de 2023 17Eiji Adachi Barbosa

Page 18: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Tratamento de exceções

• Por que é importante tratar exceções?

– Você pode irritar o seu usuário

21 de abr de 2023 18Eiji Adachi Barbosa

Page 19: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Tratamento de exceções

• Por que é importante tratar exceções?

– Os usuários podem perder a confiança no seu produto

– ... e você pode passar uma tremenda vergonha!

21 de abr de 2023 19Eiji Adachi Barbosa

Page 20: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Tratamento de exceções

• Vídeo do Bill Gates:

– http://www.youtube.com/watch?v=TrAD25V7ll8

21 de abr de 2023 20Eiji Adachi Barbosa

Page 21: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Tratamento de exceções

• Por que é importante tratar exceções?

– Pode custar milhões de dólares/reais/euros

– Ou até mesmo vidas

21 de abr de 2023 21Eiji Adachi Barbosa

Page 22: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Tratamento de exceções

21 de abr de 2023 22Eiji Adachi Barbosa

• Vídeo do Ariane 5:

– http://www.youtube.com/watch?v=kYUrqdUyEpI

Page 23: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Tratamento de exceções - Caso de insucesso

• Em outubro de 1996 o foguete francês Ariane 501 se autodestruiu 5 minutos após decolar

• Motivo: – cálculo errado do ângulo de ataque

• Causa:– O Ariane 5 reutilizou um módulo do Ariane 4 para calcular o

“Alinhamento Interno”, elemento relacionado com a componente horizontal da velocidade

– O valor gerado pelo módulo do Ariane 4 foi muito maior do que o esperado pelo módulo do Ariane 5, pois a trajetória do Ariane 5 difere da trajetória do Ariane 4

– O módulo do Ariane 5 tentou converter o valor do “Alinhamento Interno” de um número de 64 bits em ponto flutuante para um inteiro de 16 bits com sinal

– Valor em ponto flutuante era maior do que poderia ser representado por um inteiro

– Operação de conversão não estava protegida– Overflow Exception

21 de abr de 2023 23Eiji Adachi Barbosa

Page 24: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Tratamento de exceções

• Exemplos de tratadores:– recuperação por retrocesso: o tratador desfaz modificações nas variáveis

locais e retorna um resultado indicando insucesso na operação

– fechamento: o tratador garante que uma conexão/arquivo aberta(o) seja fechada(o)

– notificação ao usuário: nenhuma recuperação, somente notifica ao usuário que uma exceção ocorreu

– armazenamento de erro: criação de registro de erro em arquivo especial

– re-sinaliza uma exceção diferente... Para a função chamadora

– nova tentativa: a mesma função ou uma diferente implementação (daquela função) é invocada

• é usada em técnicas como bloco de recuperação ou programação N-Versões

– tratador vazio: “silencia” a exceção – má pratica e deve ser evitado

– assert: o tratador desempenha algum tipo de operação de assert; quanto a assertiva não é válida, isto resulta em uma nova exceção, possivelmente levando ao término da execução do programa

21 de abr de 2023 24Eiji Adachi Barbosa

Page 25: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Como tratar exceções?

• Linguagens contemporâneas (Java, JavaScript, C++, C#, Python...) possuem mecanismos de tratamento de exceções implementados na própria linguagem

– TRY-CATCH-FINALLY

• A linguagem C não traz suporte específico para tratamento de exceções, por isso o faz através de um idioma:

– Testando condições de retorno

– Modificando / testando variáveis globais ou parâmetros passados por referência

21 de abr de 2023 25Eiji Adachi Barbosa

São usados de forma complementar!

Page 26: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Testando condições de retorno

• O comando return é utilizado pela função chamada para indicar sob qual condição (normal | excepcional) sua execução encerrou

• A função chamadora deve testar o código retornado pela função chamada a fim de tomar ações corretivas, caso necessário

• Preferencialmente, as condições de retorno devem ser declaradas como um elemento enum

21 de abr de 2023 26Eiji Adachi Barbosa

Page 27: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Testando condições de retorno

typedef enum {

LIS_CondRetOK ,

/* Concluiu corretamente */

LIS_CondRetListaVazia ,

/* A lista não contém elementos */

LIS_CondRetFimLista ,

/* Foi atingido o fim de lista */

LIS_CondRetNaoAchou ,

/* Não encontrou o valor procurado */

LIS_CondRetFaltouMemoria

/* Faltou memória ao tentar criar um elemento de lista */

} LIS_tpCondRet ;

LIS_tpCondRet LIS_InserirElementoAntes

( LIS_tppLista pLista , void * pValor )

{

tpElemLista * pElem ;

pElem = CriarElemento( pLista , pValor ) ;

if ( pElem == NULL ) {

return LIS_CondRetFaltouMemoria ;

} /* if */

....

return LIS_CondRetOK ;

} /* Fim função: LIS &Excluir elemento */

21 de abr de 2023 27Eiji Adachi Barbosa

Page 28: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Testando condições de retorno

int main(void){...LIS_tpCondRet condRet = InserirElementoAntes( lista, pValor );

switch( condRet ) {case LIS_CondRetFaltouMemoria:

...case LIS_CondRetOK:

...default :

printf(“Condição de retorno inesperada”);}

}

21 de abr de 2023 28Eiji Adachi Barbosa

Page 29: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Usando variáveis globais ou parâmetros

• A função chamada deve modificar variáveis globais ou parâmetros passados por referência para indicar sob qual condição (normal | excepcional) sua execução encerrou

• A função chamadora deve testar a variável global, ou o parâmetro passado por referência, a fim de tomar ações corretivas, caso necessário

21 de abr de 2023 29Eiji Adachi Barbosa

Page 30: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Usando parâmetro passado por referência

LIS_tpCondRet LIS_InserirElementoAntes

( LIS_tppLista pLista , void * pValor, char ** errorMsg )

{

tpElemLista * pElem ;

pElem = CriarElemento( pLista , pValor ) ;

if ( pElem == NULL ) {

char str[] = “Não foi possível alocar memória para um novo elemento”;

int size = strlen( str ) + 1;

(*errorMsg) = (char*)malloc( sizeof(char) * size );

memcpy( (*errorMsg), str, size );

return LIS_CondRetFaltouMemoria ;

} /* if */

....

return LIS_CondRetOK ;

} /* Fim função: LIS &Excluir elemento */

Usar uma variável global, seria análogo...

21 de abr de 2023 30Eiji Adachi Barbosa

Page 31: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Usando parâmetro passado por referência

int main(void){...char *errorMsg;LIS_tpCondRet condRet = InserirElementoAntes( lista, pValor, &errorMsg );

switch( condRet ) {case LIS_CondRetFaltouMemoria:

printf( “%s”, errorMSG );case LIS_CondRetOK:

...default :

printf(“Condição de retorno inesperada”);}

}

Usar uma variável global, seria análogo...

21 de abr de 2023 31Eiji Adachi Barbosa

Page 32: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Limitações de C

• A sinalização de uma exceção não é explícita

– Usa-se o comando return, parâmetros passados por referência ou variáveis globais

• Nem sempre é possível retornar um elemento enumerado como condição de retorno

– Ex.: Trabalho 1 – Implemente uma função que receba os três parâmetros (Nome, Iniciais, Idade) e retorne por referência a estrutura preenchida.

• Como prover mais informações a respeito do problema / exceção?

– Ex.: Qual a severidade? Que condições levaram a esta ocorrência?

21 de abr de 2023 32Eiji Adachi Barbosa

Page 33: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Limitações de C

• Há um overhead na criação de tipos enumerados para cada módulo

• A associação entre as exceções descritas nos tipos enumerados e quais exceções que podem ser levantadas por uma função depende exclusivamente da especificação da função

– Difícil entender o acoplamento excepcional entre funções: quais exceções devem ser tratadas?

• Não há separação textual do código de tratamento de exceção

– Código torna-se rapidamente extenso, complexo e pouco compreensível

• Como assegurar que as pós-condições da função serão satisfeitas, mesmo em casos excepcionais?

21 de abr de 2023 33Eiji Adachi Barbosa

Page 34: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Linguagens contemporâneas

• Linguagens como Java, JavaScript, C++, C#, Python ... provêem mecanismos de tratamento de exceções implementados na própria linguagem

– TRY – define uma região protegida contra a ocorrência de exceções

– CATCH – define um tratador, i.e., um trecho de código que implementa um conjunto de ações de recuperação

– FINALLY – define um trecho de código que sempre será executado, mesmo quando exceções ocorrerem

– THROW – sinaliza a ocorrência de uma exceção

– THROWS – especifica o acoplamento excepcional de uma função

21 de abr de 2023 34Eiji Adachi Barbosa

Page 35: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Acoplamento excepcional explícito

static void escreveArquivo(Arquivo) throws FileNotFoundException,

CharCodingException,

PermissionException;

21 de abr de 2023 35Eiji Adachi Barbosa

Page 36: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Sinalização explícita de exceções

static void escreveArquivo(Arquivo a) throws FileNotFoundException,

CharCodingException,

PermissionException {

Buffer bf = buscaArquivo( a );

if( bf == null )

throw new FileNotFoundException();

}

21 de abr de 2023 36Eiji Adachi Barbosa

Page 37: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Melhor separação textual

ARQ_tpCondRet leArquivo(){condRet = OK;abreArquivo();se( arquivoAberto() ){

determineTamanhoArquivo();se( determinouTamanho() ){

aloqueMemoria();se( alocouMemoria() ){

copieDados();se( ! copiouDados() ){ condRet = ERRO_COPIAR_DADOS;}

} senão {condRet = ERRO_ALOCAR_MEM;

}} senão {

condRet = ERRO_DET_TAM;}fecheArquivo();se( ! fechouArquivo() ){

condRet = ERRO_FECHAR_ARQ;}

} senão {condRet = ERRO_ABRIR_ARQ;

}}

leArquivo(){try{

abreArquivo();determineTamanhoArquivo();aloqueMemoria();copieDados();

} catch( abrirErro ){...} catch( determinarTamanhoErro ) {...} catch( alocarMemoriaErro ) {...} catch( copiarDadosErro ) {...} finally {

try{fecheArquivo();

} catch( fecharArquivoErro ){...}}

}

21 de abr de 2023 37Eiji Adachi Barbosa

Page 38: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Lista preencheLista(){

Arquivo arq = null;

Lista lista = null;

try{

arq = abreArquivo( “Dados.txt” );

lista = criaLista();

for( i=0; i<SIZE; i++ ){

adiciona( lista, arq, i );

}

//faz mais alguma coisa

} catch( RegistroException ){

print( “Registro lido incorretamente” );

} finally {

if( arq != null){

fechaArquivo( arq );

}

}

return lista;

}

void adiciona(Lista lista, Arquivo arq,

int i ) throws RegistroException {

Registro r = leRegistro( arq, i );

Elemento e = criaElement( r );

adicionaElemento( lista, e, i );

}

Execução e transferência não-local

preecheLista()

finally

catch( RegistroException )

21 de abr de 2023 38Eiji Adachi Barbosa

Page 39: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Lista preencheLista(){

Arquivo arq = null;

Lista lista = null;

try{

arq = abreArquivo( “Dados.txt” );

lista = criaLista();

for( i=0; i<SIZE; i++ ){

adiciona( lista, arq, i );

}

//faz mais alguma coisa

} catch( RegistroException ){

print( “Registro lido incorretamente” );

} finally {

if( arq != null){

fechaArquivo( arq );

}

}

return lista;

}

void adiciona(Lista lista, Arquivo arq,

int i ) throws RegistroException {

Registro r = leRegistro( arq, i );

Elemento e = criaElement( r );

adicionaElemento( lista, e, i );

}

Execução e transferência não-local

preecheLista()

finally

catch( RegistroException )

abreArquivo

21 de abr de 2023 39Eiji Adachi Barbosa

Page 40: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Lista preencheLista(){

Arquivo arq = null;

Lista lista = null;

try{

arq = abreArquivo( “Dados.txt” );

lista = criaLista();

for( i=0; i<SIZE; i++ ){

adiciona( lista, arq, i );

}

//faz mais alguma coisa

} catch( RegistroException ){

print( “Registro lido incorretamente” );

} finally {

if( arq != null){

fechaArquivo( arq );

}

}

return lista;

}

void adiciona(Lista lista, Arquivo arq,

int i ) throws RegistroException {

Registro r = leRegistro( arq, i );

Elemento e = criaElement( r );

adicionaElemento( lista, e, i );

}

Execução e transferência não-local

preecheLista()

finally

catch( RegistroException )

criaLista

21 de abr de 2023 40Eiji Adachi Barbosa

Page 41: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Lista preencheLista(){

Arquivo arq = null;

Lista lista = null;

try{

arq = abreArquivo( “Dados.txt” );

lista = criaLista();

for( i=0; i<SIZE; i++ ){

adiciona( lista, arq, i );

}

//faz mais alguma coisa

} catch( RegistroException ){

print( “Registro lido incorretamente” );

} finally {

if( arq != null){

fechaArquivo( arq );

}

}

return lista;

}

void adiciona(Lista lista, Arquivo arq,

int i ) throws RegistroException {

Registro r = leRegistro( arq, i );

Elemento e = criaElement( r );

adicionaElemento( lista, e, i );

}

Execução e transferência não-local

preecheLista()

finally

catch( RegistroException )

adiciona

leRegistro

21 de abr de 2023 41Eiji Adachi Barbosa

Page 42: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Lista preencheLista(){

Arquivo arq = null;

Lista lista = null;

try{

arq = abreArquivo( “Dados.txt” );

lista = criaLista();

for( i=0; i<SIZE; i++ ){

adiciona( lista, arq, i );

}

//faz mais alguma coisa

} catch( RegistroException ){

print( “Registro lido incorretamente” );

} finally {

if( arq != null){

fechaArquivo( arq );

}

}

return lista;

}

void adiciona(Lista lista, Arquivo arq,

int i ) throws RegistroException {

Registro r = leRegistro( arq, i );

Elemento e = criaElement( r );

adicionaElemento( lista, e, i );

}

Execução e transferência não-local

preecheLista()

finally

catch( RegistroException )

adiciona

leRegistro

Esse trecho de código não é executado!

21 de abr de 2023 42Eiji Adachi Barbosa

Page 43: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Lista preencheLista(){

Arquivo arq = null;

Lista lista = null;

try{

arq = abreArquivo( “Dados.txt” );

lista = criaLista();

for( i=0; i<SIZE; i++ ){

adiciona( lista, arq, i );

}

//faz mais alguma coisa

} catch( RegistroException ){

print( “Registro lido incorretamente” );

} finally {

if( arq != null){

fechaArquivo( arq );

}

}

return lista;

}

void adiciona(Lista lista, Arquivo arq,

int i ) throws RegistroException {

Registro r = leRegistro( arq, i );

Elemento e = criaElement( r );

adicionaElemento( lista, e, i );

}

Execução e transferência não-local

preecheLista()

finally

print

Esse trecho de código não é executado!

catch( RegistroException )

21 de abr de 2023 43Eiji Adachi Barbosa

Page 44: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Lista preencheLista(){

Arquivo arq = null;

Lista lista = null;

try{

arq = abreArquivo( “Dados.txt” );

lista = criaLista();

for( i=0; i<SIZE; i++ ){

adiciona( lista, arq, i );

}

//faz mais alguma coisa

} catch( RegistroException ){

print( “Registro lido incorretamente” );

} finally {

if( arq != null){

fechaArquivo( arq );

}

}

return lista;

}

void adiciona(Lista lista, Arquivo arq,

int i ) throws RegistroException {

Registro r = leRegistro( arq, i );

Elemento e = criaElement( r );

adicionaElemento( lista, e, i );

}

Execução e transferência não-local

preecheLista()

finally

fechaArquivo

Esse trecho de código não é executado!

21 de abr de 2023 44Eiji Adachi Barbosa

Page 45: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Testes e exceções

• Dificuldade em testar código de tratamento de exceção:– Código tratador é pouco executado

• Exceções ocorrem raramente

– Como lançar a exceção e testar o tratador?• Descobrir quais assertivas devem ser quebradas

• Mecanismos de injeção de erros

• Qual ação esperada do tratador?

21 de abr de 2023 45Eiji Adachi Barbosa

Page 46: Aula  15  Estrutura de Funções e  Tratamento de Exceções

Referência

• Cap. 8 do livro Programação Modular

21 de abr de 2023 46Eiji Adachi Barbosa

Page 47: Aula  15  Estrutura de Funções e  Tratamento de Exceções

FIM

21 de abr de 2023 47Eiji Adachi Barbosa