Ling. Prog.

Click here to load reader

  • date post

    07-Jan-2017
  • Category

    Documents

  • view

    240
  • download

    0

Embed Size (px)

Transcript of Ling. Prog.

  • Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    Linguagens de Programao

    Prof. Miguel Elias Mitre Campista

    http://www.gta.ufrj.br/~miguel

  • Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    Parte IV

    Introduo Programao em C++ (Continuao)

  • Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    Relembrando da ltima Aula...

    Entrada e sada

    Mais exemplos de programao orientada a objetos...

  • Tratamento de Exceo

    Excees

    Indicam problemas ocorridos no programa Ocorrncias nem sempre esperadas que no deveriam

    acontecer

    Representam comportamento que no comum Uma "exceo" em um programa que normalmente funciona

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Tratamento de Exceo

    Tratamento de exceo

    Programas que resolvem excees Continuam a sua execuo mesmo em face de um erro

    Programas que so capazes de continuar execuo Trmino controlado

    Problemas mais severos podem impedir que um programa continue a sua execuo

    Programas que toleram falhas Ex.: Lidar com um programa que divida por zero

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Tratamento de Exceo

    Considere o pseudocdigo:

    Realize uma tarefa

    Se a tarefa precedente no executou corretamente Realize processamento de erro

    Realize a prxima tarefa

    Se a tarefa precedente no executou corretamente Realize processamento de erro

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Tratamento de Exceo

    Considere o pseudocdigo:

    Realize uma tarefa

    Se a tarefa precedente no executou corretamente Realize processamento de erro

    Realize a prxima tarefa

    Se a tarefa precedente no executou corretamente Realize processamento de erro

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    Mistura de lgica e tratamento de erro pode tornar o programa difcil de ler/depurar

  • Tratamento de Exceo

    Tratamento de exceo remove correo de erro da linha principal do programa

    Torna o programa mais claro e melhora a manuteno

    Programadores podem decidir se tratam: Todas as excees

    Excees de um tipo especfico

    Excees de tipos relacionados

    Objetos de classes especficas tratam os erros Possibilidade do uso de herana e polimorfismo

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Tratamento de Exceo

    S pode tratar erros sncronos:

    Aqueles que seguem a linha de execuo do programa Exs.: diviso por zero, ponteiro nulo

    No pode tratar erros assncronos (independente do programa)

    Ex.: I/O de disco, mouse, teclado, mensagens de rede que ocorrem em paralelo e de maneira independente do fluxo de controle do programa em execuo

    Erros mais fceis de tratar

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Tratamento de Exceo

    Terminologia

    Funo que tem erros dispara uma exceo (throws an exception)

    Tratamento de exceo (se existir) pode lidar com problema

    Pega (catches) e trata (handles) a exceo

    Se no houver tratamento de exceo, exceo no pega

    Pode terminar o programa (uncaught)

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Tratamento de Exceo

    Cdigo C++ try {

    cdigo que pode provocar uma exceo

    }

    catch (exceptionType){

    cdigo para tratar a exceo

    }

    Bloco try possui cdigo que pode provocar exceo

    Um ou mais blocos catch devem ser escritos imediatamente aps o bloco try correspondente

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Bloco catch

    Exceo tratada em um bloco catch apropriado Blocos catch definem exatamente o tipo de exceo

    tratada Pode ser o tipo exato ou uma classe base da exceo

    disparada

    Parmetro de recebimento do bloco catch Se nomeado, pode acessar objeto de exceo

    Cada bloco catch trata apenas um tipo de exceo

    Colocar mais de um tipo separado por vrgulas erro de sintaxe

  • Bloco catch

    Reporta a exceo ao usurio

    Registra a exceo em um arquivo

    Termina o programa corretamente Ou tenta uma estratgia alternativa para lidar com a

    tarefa que falhou

  • Tratamento de Exceo

    Throw point

    Local no bloco try onde a exceo ocorre

    Se a exceo for tratada Programa pula o restante do bloco try

    Executa o bloco catch correspondente

    Reinicia depois do bloco catch Variveis locais ao bloco catch saem do escopo

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    Execuo do programa no retorna ao ponto onde a exceo foi disparada!

  • Tratamento de Exceo

    Throw point

    Se a exceo for disparada mas no for tratada por nenhum bloco catch

    Ou se a exceo for disparada em uma sentena que no est em um bloco

    Funo termina imediatamente e o programa tenta encontrar o bloco try na funo chamadora

    Se no houver exceo Programa termina o bloco try e continua a execuo

    aps pular todos os blocos catchs No implica queda de desempenho

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Outras Tcnicas para Tratamento de Erros

    Ignorar exceo Tpico para software pessoal (no comercial)

    Programa pode falhar

    Abortar programa Frequentemente apropriado

    No apropriado para software de misso crtica

    Teste para condio de erro Chamar funo exit () e passar cdigo de

    erro

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo Simples de Tratamento de Exceo: Diviso por Zero

    Palavra-chave: throw Dispara uma exceo

    Usada quando ocorre erro

    Pode disparar objeto de exceo, inteiro etc. throw myObject;

    throw 5;

    Objetos de exceo Classe base exceo ( ) Construtor pode receber uma string (para descrever a

    exceo) Funo membro what() retorna essa string

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo Simples de Tratamento de Exceo: Diviso por Zero

    Tratamento de erros por diviso por zero Define nova classe de exceo

    DivideByZeroException

    Herdada da classe exception

    Na funo de diviso Testar denominador

    Se zero, dispara uma exceo (throw object)

    No bloco try

    Tentativa de dividir

    Possui associado o bloco catch Pega objetos DivideByZeroException

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Primeiro Exemplo Usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    Possibilidade 1

  • Primeiro Exemplo Usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    Possibilidade 2

  • Primeiro Exemplo Usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Primeiro Exemplo Usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Primeiro Exemplo Usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Redisparo de uma Exceo (Rethrow exception)

    Usado quando um tratador de exceo no pode processar a exceo ou quando pode somente process-la parcialmente

    Nesses casos, o tratador da exceo pode adiar o tratamento

    Pode redisparar mesmo aps o tratador ter feito algum processamento

    Pode redisparar uma exceo para um outro tratador Vai para o prximo bloco try

    Blocos catch correspondentes tentam tratar

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Redisparo de uma Exceo (Rethrow exception)

    Para redisparar Usado com o sentena "throw;"

    Sem argumentos

    Termina uma funo

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Segundo Exemplo Usando Tratamento de Exceo em C++ O redisparo fez com que...

    A funo throwException no continue a sua execuo aps o catch

    Se no houvesse redisparo a execuo da funo continuaria

    O bloco try da funo principal no continue a sua execuo aps a chamada da funo throwException

    Se no houvesse redisparo a execuo da funo continuaria

    O catch da funo principal fosse invocado Se no houvesse redisparo a execuo da funo

    continuaria

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Especificao de Excees

    Tipo de exceo disparada por uma funo pode ser limitada Adio de sufixo no prottipo da funo

    Se myfunction disparar outro tipo de exceo, essa no tratada pelo catch de inteiro correspondente

    Compilador permite disparos de tipos diferentes do definido, entretanto erros podem ocorrer em execuo

    float myfunction (char) throw (int);

    // Excees no so permitidas

    float myfunction (char) throw ();

    // Todas as excees so permitidas

    float myfunction (char);

  • Especificao de Excees

    Lista de excees que podem ser disparadas

    Tambm chamada de lista de disparo (throw list) int someFunction( double value )

    throw ( ExceptionA, ExceptionB, ExceptionC ) {

    // corpo da funo

    }

    Pode somente disparar ExceptionA, ExceptionB e ExceptionC (e classes derivadas)

    Se dispara outro tipo, funo unexpected chamada

    Por padro, essa funo termina o programa

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Processamento de Excees Unexpected

    Funo unexpected Chamada quando a exceo disparada no se encontra

    na throw list

    Chama funo registrada com set_unexpected Definida em Caso nenhuma funo tenha sido registrada, funo terminate chamada por padro

    set_terminate

    Define qual funo terminate chamada Por padro, chama abort

    Se redefinido, ainda chama abort depois da nova funo terminar

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Processamento de Excees Unexpected

    Argumentos para as funes de definio: set_unexpected e set_terminate

    Recebe ponteiro para funo Funo no deve receber argumentos

    Retorna void

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Segundo Exemplo Usando Tratamento de Exceo em C++

  • Segundo Exemplo Usando Tratamento de Exceo em C++

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    E se inserirmos o tipo char na throw list?

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    Funciona?

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    Por que no?

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    Faltava definir o bloco catch correspondente?

  • Segundo Exemplo Usando Tratamento de Exceo em C++

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    Provocando erro para chamada da funo definida

    em set_terminate. A funo no causa chamada recursiva pois a funo

    myunexpected pode disparar qualquer exceo

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    Trmino controlado, caso contrrio, chamada a

    funo abort diretamente

  • Segundo Exemplo Usando Tratamento de Exceo em C++

    Trmino controlado, caso contrrio, chamada a

    funo abort diretamente

  • Liberao da Pilha

    Se exceo dispara mas no pega Termina funo atual

    Libera chamada da funo da pilha de execuo

    Procura try/catch que pode tratar a exceo

    Se nenhuma for encontrada, libera novamente

    Se exceo nunca for pega Chama terminate

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Terceiro Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Terceiro Exemplo usando Tratamento de Exceo em C++

    Blocos try/catch no so encontrados em nenhuma das funes, a execuo das funes terminada...

    Funo 3 dispara exceo que no pega nem na prpria funo, nem na funo 2 e nem na funo 1

  • Terceiro Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Terceiro Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    Exceo s pega na funo principal...

  • Terceiro Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Terceiro Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    E se fosse assim?

  • Terceiro Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Terceiro Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    E se fosse assim?

  • Terceiro Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Construtores, Destrutores e Tratamento de Exceo

    Erro no construtor new falha

    Por exemplo: no pode alocar memria

    Contrutor no pode retornar um valor: Como informar o usurio?

    Espera-se que o usurio examine o objeto e note os erros?

    Uso de variveis globais?

    Boa alternativa: disparar uma exceo Liberao da pilha

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Quarto Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Quarto Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Excees e Herana

    Classes de exceo

    Podem ser derivadas de uma classe base Por exemplo, exception

    Se catch pode tratar classe base, pode tratar classes derivadas

    Programao polimrfica

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Processamento de Novas Falhas

    Quando o new falha para alocar memria...

    Deve-se disparar exceo do tipo bad_alloc Definida em

    Alguns compiladores tm new retornando 0 (zero)

    Resultado depende do compilador

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Quarto Exemplo usando Tratamento de Exceo em C++

  • Quarto Exemplo usando Tratamento de Exceo em C++

  • Quinto Exemplo usando Tratamento de Exceo em C++

  • Quinto Exemplo usando Tratamento de Exceo em C++

  • Processamento de Novas Falhas

    set_new_handler

    Cabealho

    Registra funo para chamar quando new falha

    Usa ponteiro de funo para funes que: No possui parmetros

    Retorna void

    Uma vez registrada, funo chamada ao invs de disparar exceo

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Sexto Exemplo usando Tratamento de Exceo em C++

  • Sexto Exemplo usando Tratamento de Exceo em C++

  • Classe auto_ptr e Alocao Dinmica de Memria

    Declarar ponteiro, alocar memria com new

    E se a memria for alocada corretamente, mas a exceo ocorrer antes de liberar (delete) o objeto?

    Vazamento de memria

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Classe auto_ptr e Alocao Dinmica de Memria

    Classe template auto_ptr

    Cabealho

    Quando ponteiro sai do escopo, chama-se delete

    Previne vazamento de memria

    Sobrecarrega ponteiros regulares (* e ->) Objeto auto_ptr pode ser usado como um ponteiro

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    auto_ptr< MyClass > newPointer( new MyClass() );

    \\ newPointer aponta para objeto alocado dinamicamente

  • Stimo Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Stimo Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Stimo Exemplo usando Tratamento de Exceo em C++

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Hierarquia da Biblioteca Padro de Exceo

    Hierarquia de exceo Classe base de exceo ()

    Funo virtual what, sobrescrita para prover mensagens de erro

    Classes derivadas runtime_error, logic_error bad_alloc, bad_cast, bad_typeid

    Disparada por new, dynamic_cast e typeid

    Para pegar todas as excees catch(...)

    catch( exception AnyException)

    No ir pegar excees definidas por usurios que no foram derivadas da classe exception

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Oitavo Exemplo usando Tratamento de Exceo em C++

  • Oitavo Exemplo usando Tratamento de Exceo em C++

  • Exemplo 1

    Escreva um programa que dispare uma exceo caso haja uma tentativa de acesso a uma posio fora do escopo definido em um vector. Utilize um objeto da classe out_of_range para pegar a exceo.

    ?

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo 1

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo 1

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo 2

    Escreva um programa que dispare uma exceo no listada nos especificadores da exceo (lista de disparo) e redisparada usando o tipo bad_exception.

    ?

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo 2

  • Exemplo 2

  • Exemplo 3

    Escreva um programa que dispare uma exceo se a idade do cadastro for menor que 18 anos. Para isso crie uma Classe Cadastro que recebe um nome e uma idade e utilize um objeto da Classe UnderAgeException para disparar uma exceo.

    ?

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo 3

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo 3

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo 3

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo 3

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Exemplo 3

    Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

  • Linguagens de Programao DEL-Poli/UFRJ Prof. Miguel Campista

    Leitura Recomendada

    Captulos 16 do livro Deitel, C++ How to Program, 5th edition, Editora

    Prentice Hall, 2005