Aula 17 Tratamento de Exceções e Assertivas

Documentos relacionados
Aula 16 Tratamento de Exceções. Eiji Adachi Barbosa LES / DI / PUC-Rio Outubro / 2013

Aula 22 Tratamento de Exceções

Aula 19 Estrutura de Funções - 1

Tratamento de Exceções

Aula 04 Conceitos e Princípios de Modularidade 3 Alessandro Garcia

Tratamento de Exceções. LPG II Java. Tratamento de Exceções. Conceito de Exceções. Exemplo

Aula 04 Princípios de Modularidade 3 e Introdução à Teste de Software Alessandro Garcia

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

Tratamento de Exceções. Grupo de Linguagens de Programação Departamento de Informática PUC-Rio

Tratamento de Exceções

Tratamento de Exceção. Tratamento de Exceções. Vantagens de TE. Exemplos de Exceções. Exemplo: Divide1 (sem TE)

Template de classe. class vetor { int *arranjo; int limite; public: vetor(int=100); int & operator[ ](int n); };

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Aula 5 Introdução à Teste de Módulos. Alessandro Garcia LES/DI/PUC-Rio Agosto 2017

Programação Orientada a Objetos SANTOS, Rafael (PLT)

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

LINGUAGEM DE PROGRAMAÇÃO I

Tratamento de Exceções

Estruturas de funções I Aula 13

Programação II. Aula 3

Apêndice 1. Recomendações para testes de módulos

Tratamento de Exceção. Programação Orientada a Objetos Java (Rone Ilídio)

Programação Orientada a Objetos (DPADF 0063)

Programação de Computadores II TCC /Turma A 1

Programação Java. Tratamento de Exceções

Aula 17 Revisão. Alessandro Garcia LES/DI/PUC-Rio Abril 2010

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc.

Aula 11 Assertivas. Alessandro Garcia LES/DI/PUC-Rio Abril 2016

Leitura e Validação de Dados I

Programação Orientada a Objetos II

Aula 13 Tratamento de Exceções. Disciplina: Programação Estruturada e Orientada a Objetos Prof. Bruno Gomes

Programação Orientada a Objetos. Manipulação de Exceções

Aula 11. Assertivas. Alessandro Garcia LES/DI/PUC-Rio Setembro 2009

Tratamento de Exceções. Julio Cesar Nardi

Prof. Rogério Albuquerque de Almeida. Programação Orientada a Objetos II JAVA Décima Segunda Aula

Java para Desktop. Exceções JSE

Controlando Erros com Exceções

Lógica de Programação e Algoritmos com exemplos na linguagem JAVA

Programação de Computadores II

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Computação II Orientação a Objetos

Programação Modular: Prova, Trabalho e Considerações Finais

Linguagem C Princípios Básicos (parte 1)

O tratamento de erros em Java

Algoritmos e Programação

Programação Orientada a Objetos para Redes de Computadores

Capítulo 8. Estruturas de Controle no Nível de Sentença

INF1005: PROGRAMAÇÃO I. Capítulo 12. Ivan Mathias Filho Funções Matemáticas

Parte IV. Linguagens de Programação. Relembrando da Última Aula... Tratamento de Exceção. Tratamento de Exceção. Tratamento de Exceção

Exceções AULA 13. Ricardo Massa F. Lima Sérgio C. B. Soares

SCC Capítulo 2 Recursão

Python: Exceções, Iteradores e Geradores. Claudio Esperança

Computação II Orientação a Objetos

Aula 12 Modelos Arquitetural e Físico Outros Princípios de Modularidade

Notas de Aula 09: Tratamento de exceções

5 - COMANDOS DE CONTROLE DE PROGRAMA Em C existem os comandos de decisões, os comandos de iteração (ou de laços) e os comandos de desvios.

Laboratório de programação II

Estruturas de Controle

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

Programação Estruturada e Orientada a Objetos

Fundamentos de Programação. Linguagem C++ aula II - Variáveis e constantes. Prof.: Bruno Gomes

LINGUAGEM C CONTROLE DE FLUXO

MCG126 Programação de Computadores II

Tratamento de Exceções em Java

Tratamento de Exceções. Profa. Thienne Johnson EACH/USP

Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação

Linguagens de Programação

Fundamentos de Programação. Linguagem C++ Introdução, identificadores, tipos de dados. Prof. Bruno E. G. Gomes IFRN

C Comandos de Controle

Sub Rotinas. Estrutura de Dados. Prof. Kleber Rezende

Variáveis primitivas e Controle de fluxo

3. Linguagem de Programação C

TECNOLOGIAS DE CONSTRUÇÃO

Linguagens de Programação Aula 11

USP - ICMC - SSC SSC o. Semestre Disciplina de Introdução à Computação para Engenharia Ambiental

Tratamento de Exceções. Java Avançado. Tratamento de Exceções. Conceito de Exceções. Exemplo

TRATAMENTO DE EXCEÇÕES

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

Programação Modular: Exercício T4 e Considerações Finais

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Fundamentos de Programação

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Idiomas de Programação

Fundamentos de Programação

Aula 13 POO 1 Tratamento de Exceções no Java. Profa. Elaine Faria UFU

Algoritmos e Programação

Leitura Segura de Strings

- Mapa de memória de um processo - Ponteiros

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

C Comandos de Controle

Teste de Software. Competência: Entender as técnicas e estratégias de testes de Software

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Comandos de Controle do Programa

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

1. Estude e implemente a classe Exemplo1 apresentada abaixo:

Revisão. Profa Marina Gomes

Paradigmas de Linguagens de Programação. Tipos de Dados Abstratos

Manipulação de excecões e manipulação de eventos

Transcrição:

Aula 17 Tratamento de Exceções e Assertivas Alessandro Garcia LES / DI / PUC-Rio Novembro / 2016 Sumário Definições básicas Como se encerram as funções? Problema: e quando funções não encerram corretamente? Tratamento de exceções Tipos de tratadores Como tratar exceções Em C Em linguagens de programação contemporâneas 1 1

Referência Cap. 8 do livro Programação Modular Leituras complementares: Artigos Discovering Faults in Idiom-Based Exception Handling, Bruntink, M., van Deursen, A. and Tourwé, T. In Proceedings of 28th ICSE, 2006. Tutorial sobre tratamento de exceções em Java http://download.oracle.com/javase/tutorial/essential/exceptions/in dex.html 2 Relembrando - 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... pode terminar de duas formas: normalmente ou exceção TIPO_RETORNO NOME_FUNCAO ( LISTA_PARAMETROS) { CORPO_FUNCAO 3 2

Definições básicas 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 após o return passa da função chamada para a função chamadora O comando exit(int) Encerra a execução do programa 1. Executa em ordem reversa todas as funções registradas pela função int atexit( void(*func)(void) ) 2. Todos arquivos são fechados, todos arquivos temporários são apagados 3. O controle de execução retorna ao ambiente-hospedeiro (host enviornment) o valor inteiro passado como argumento 4 O que são assertivas? Assertivas são condições envolvendo dados e estados manipulados que devem ser satisfeitas em determinadas partes do algoritmo de preferência, deve ser código (ao invés de comentários) São definidas em vários níveis de abstração funções devem estar satisfeitas em determinados pontos do corpo da função usualmente assertivas de entrada e assertivas de saída módulos pré e pós condições na definição das pós-condições, assume-se que as pré-condições foram satisfeitas devem estar satisfeitas ao entrar e ao retornar de todas funções assertivas invariantes: assertivas estruturais: corretude das instâncias de estruturas de dados Abril 2009 LES/DI/PUC-Rio 5/30 3

Exceptions Exceções Eventos inesperados que ocorrem na execução do módulo, o impedindo de continuar o fluxo de execução normal Press any key to continue _ Exemplos de exceções Exemplos: Um valor de um dos parâmetros ou variáveis viola assertivas de entrada, saída Ex. Um parâmetro de entrada ocasiona uma divisão por zero Uma das assertivas estruturais é violada Não há memória disponível quando você tenta alocar memória dinamicamente Hardware para de funcionar corretamente 7 4

Tratamento de exceções Por que é importante tratar exceções? Você pode irritar o seu usuário 8 Tratamento de exceções Por que é importante tratar exceções? Robustez: reagir adequadamente a eventos anormais Usuário pode perder a confiança no seu sistema e deixar de usá-lo Segurança: exceções não tratadas representam vulnerabilidades de segurança Versões 4.0.4.. 6: 132 vulnerabilidades de exceções não tratadas foram reveladas Podem levar a ataques resultando Deniel of Service Varios smartphones impactados: Google, Huawei, Lenovo, Samsung, LG, Motorola, HTC and Nubia 9 5

Tratamento de exceções Sistemas atuais são cada vez maiores e mais complexos Condições excepcionais podem surgir por diversos motivos e serem até mesmo difíceis de serem previstas Sistemas robustos e confiáveis devem prover seus serviços mesmo sob condições excepcionais Sistemas críticos: Sistemas bancários Controladores de redes elétricas, vôo, usinas nucleares... Sistemas embarcados em aviões, submarinos, foguetes... O tratamento de exceções é parte central do desenvolvimento de sistemas robustos e confiáveis 10 Estrutura de uma função Conjunto de exceções sinalizadas na interface em C: condições de retorno excepcionais Chamadas Função Tratador E1 Tratador E2 Tratador E3 Chamadas Exceções exs.: nome de arquivo não existe, índice/chave fora do limite, conexão com servidor/banco-dados não pode ser estabelecida, etc... Maio 2009 Alessandro Garcia LES/DI/PUC-Rio 11/ 32 6

Tratamento de exceções - Terminologia Exceção: Uma exceção é um evento que ocorre durante a execução de um programa (ou módulo) e que impede a sua execução normal Uma exceção indica que o estado interno do sistema está inconsistente e, por isso, não é possível prosseguir com sua execução normal Para restaurar a consistência interna do sistema, é necessário tomar ações corretivas, ou remediadoras Tratador: Um tratador é um conjunto de ações que visam corrigir ou remediar a ocorrência de uma exceção Mecanismo de tratamento de exceções: Um mecanismo de tratamento de exceções é um modelo que permite a desenvolvedores: Representar os tipos de ocorrências de exceção Indicar a ocorrência de uma exceção na interface de funções/módulos Detectar a ocorrência de uma exceção na execução da função Estruturar ações de tratamento de exceções Desviar o fluxo normal do programa para o fluxo excepcional 12 Tratamento de exceções Exemplos de ações em tratadores: Ignora a exceção: identifica a ocorrência de uma exceção e não toma nenhuma ação corretiva. Má prática e deve ser evitada. Re-sinaliza a exceção: identifica um tipo de exceção e reporta para a função chamadora outro tipo de exceção. Geralmente é usada para preservar abstração e encapsulamento. Delegação de controle:delega o controle da execução para outro módulo do sistema mais apto a lidar com a exceção. Notificação ao usuário: notifica o usuário a ocorrência da exceção, com possibilidade de pedir novo input, caso seja possível. Preferencialmente, somente em casos que usuário deve ser envolvido. Armazenamento de erro: cria um registro da exceção e de informações adicionais em arquivo especial (log). Nova tentativa: a mesma função é simplesmente invocada novamente. (ex. exceções intermitentes do ambiente rede WiFi) 13 7

Tratamento de exceções Exemplos de ações em tratadores: Liberação de recursos:assegura a liberação de recursos alocados, como memória alocada dinamicamente, arquivos e conexões abertos, etc. Preparação para desligar: prepara o sistema para terminar sem causar efeitos colaterais. Geralmente é usada em situações extremas.é necessário liberar todos os recursos alocados e reverter o sistema para um estado em que os dados estão consistentes. Recuperação por retrocesso: desfaz modificações no estado do sistema a fim de restaurá-lo a um estado válido. Comumente usado em sistemas de bancos de dados. Recuperação por avanço: Uso de redundância de software: ativa uma função com o mesmo propósito. Uso de redundância de dados: uso de elementos adicionais da estrutura que permitam navegar de outras formas na estrutura. 14 Como tratar exceções em módulos em C? A linguagem C não traz suporte específico para tratamento de exceções Fica sob responsabilidade do programador desenvolver uma forma de identificar e tratar exceções do programa Existem várias formas de realizar esta tarefa, cada um com seus prós e contras Usamos o método mais comum e mais simples de tratamento de exceções em linguagem C... 15 8

Como tratar exceções em módulos em C? A fim de padronizar a identificação e o tratamento de exceções em C, usamos um idioma com padrões/convenções de tratamento de exceções: Tipos enum e código de retorno das funções para indicar sob qual condição a função encerrou sua execução Se necessário, define-se parâmetros adicionais passados por referência e modifica-se seus valores para informações extra do erro Neste idioma, as funções tem duas responsabilidades: A função chamada deve usar o comando return 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 16 Usando o código de retorno das funções typedef enum { LIS_CondRetOK, /* Concluiu corretamente */ LIS_CondRetListaVazia, /* A lista não contém elementos */ LIS_CondRetFimLista, /* Foi atingido o fim de lista */ LIS_tpCondRet LIS_InserirElementoAntes ( LIS_tppLista plista, void * pvalor ) { tpelemlista * pelem ; pelem = CriarElemento( plista, pvalor ) ; if ( pelem == NULL ) { return LIS_CondRetFaltouMemoria ; /* if */ LIS_CondRetNaoAchou, /* Não encontrou o valor procurado */ LIS_CondRetFaltouMemoria /* Faltou memória ao tentar criar um elemento de lista */ LIS_tpCondRet ;... return LIS_CondRetOK ; /* Fim função: LIS &Excluir elemento */ 17 9

Usando o código de retorno das funções int main(void){... LIS_tpCondRet condret = InserirElementoAntes( lista, pvalor ); switch( condret ) { case LIS_CondRetFaltouMemoria:... case LIS_CondRetOK:... default : printf( Condição de retorno inesperada ); 18 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 ); 19 10

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 */ 20 Usando variáveis globais ou parâmetros Este método é complementar ao método de condições de retorno Bastante usado na GLIBC, biblioteca padrão do sistema GNU/Linux Neste método, as funções tem as seguintes responsabilidades: 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 11

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 Não há distinção entre encerramento sob condição normal ou excepcional O sistema não é interrompido no momento em que a exceção ocorre Mesmo sabendo-se que o estado é inconsistente Como prover mais informações a respeito do problema / exceção? Ex.: Qual a severidade? Que condições levaram a esta ocorrência? Uso de parâmetros encoraja quebra de abstração e encapsulamento 22 Limitações de C Há um overhead na criação de tipos enumerados para cada módulo Para cada módulo é definido um tipo enumerado, mesmo que representem a mesma condição (EX.: Falta de memória) 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 23 12

Usando o código de retorno das funções Problemas: Chamadas encadeadas de funções podem resultar em uma estrutura muito aninhada que é difícil de compreender, testar e fazer a manutenção 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; 24 Mecanismo de Tratamento de Exceções Comportamento exceptional de funções diferente de C, Java, C# e C++ e provêem suporte explícito a tratamento de exceções Facilidades / Mecanismos para Tratamento de Exceções Exceções Tratadores (Handlers) Desvio do Fluxo e Busca de Tratadores Interfaces Excepcionais Definição de Regiões Protegidas Alessandro Garcia LES/DI/PUC-Rio 25/ 32 13

Linguagens contemporâneas Linguagens como Java, JavaScript, C++, C#, Python... proveem mecanismos de tratamento de exceções implementados na própria linguagem Elementos sintáticos específicos para tratamento de exceções: THROW sinaliza a ocorrência de uma exceção 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 26 Sinalização explícita de exceções Cláusula throw sinaliza a ocorrência de uma exceção static void escrevearquivo(arquivo a)... {... Buffer bf = buscaarquivo( a ); if( bf == null ) throw new FileNotFoundException(); 27 14

Estrutura de uma função em Java/C++ Exceções são levantadas/sinalizadas explicitamente int funcaox (...) { // código desprotegido try { // código a ser tentado; região protegida if (x > 10) {throw excecao; catch (Excecao) { // código do tratador: a ser executado // em caso de exceção if (x > 10) {throw excecao2; acoplamento: exceção sinalizada Maio 2009 Alessandro Garcia LES/DI/PUC-Rio 28/ 32 Linguagens contemporâneas Linguagens como Java, JavaScript, C++, C#, Python... provêem mecanismos de tratamento de exceções implementados na própria linguagem Elementos sintáticos específicos para tratamento de exceções: 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 THROW sinaliza a ocorrência de uma exceção THROWS especifica na interface de uma função quais as possíveis exceções que podem ser ocasionadas durante a execução daquela função do módulo 29 15

Acoplamento excepcional explícito Cláusula throws indica quais exceções podem ocorrer durante a execução de uma função void escrevearquivo(arquivo) throws FileNotFoundException, CharCodingException, PermissionException; 30 Linguagens contemporâneas Linguagens como Java, JavaScript, C++, C#, Python... provêem mecanismos de tratamento de exceções implementados na própria linguagem Elementos sintáticos específicos para tratamento de exceções: 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 THROW sinaliza a ocorrência de uma exceção THROWS especifica na interface de uma função quais as possíveis exceções que podem ser ocasionadas durante a execução daquela função do módulo FINALLY define um trecho de código que sempre será executado, mesmo quando exceções ocorrerem 31 16

Mecanismo para código de limpeza O código definido no bloco finally sempre será executado, seja após a terminação normal, ou após a terminação excepcional, de um bloco try Usado especialmente para liberação de recursos, como memória, arquivos abertos, conexões abertas, etc learquivo(){ try{ abrearquivo(); determinetamanhoarquivo(); aloquememoria(); copiedados(); catch( abrirerro ){... catch( determinartamanhoerro ) {... catch( alocarmemoriaerro ) {... catch( copiardadoserro ) {... finally { try{ fechearquivo(); catch( fechararquivoerro ){... 32 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 { fechearquivo(); 33 17

Linguagens contemporâneas Principais vantagens em relação a C: Redução do aninhamento de estruturas if-then-else Melhor separação textual entre o código que implementa a lógica da aplicação e o código que implementa o tratamento de exceções Também há uma clara distinção entre o encerramento normal de uma função ( comando return ) e o encerramento excepcional ( comando throw ) Tipos de exceção podem ser reutilizadas entre diferentes módulos Mecanismos que garantem a execução de determinados trechos de código tanto em situações normais, quanto em situações excepcionais Blocos finally Liberação de recursos 34 Linguagens contemporâneas Mesmo com os mecanismos de tratamento de exceções providos na própria linguagem, código de tratamento de exceções ainda é fonte de erros: Dificuldade em modificar métodos que tratam exceções Tratadores vazios (catch block vazio) Exceções não tratadas Erros no código de tratamento de exceções são de difícil diagnose Código pouco executado e pouco testado Implementar tratamento de exceções não é trivial e requer esforço extra dos desenvolvedores 35 18

FIM Aula 17 Tratamento de Exceções e Assertivas Alessandro Garcia LES / DI / PUC-Rio Novembro / 2016 19