·

Engenharia Elétrica ·

Linguagens de Programação

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

Tratamento de excecoes Tecnicas e Linguagens de Programacao Paulo Bentes UFPAITECFEEB May 25 2021 Tratamento de excecoes Sumario Sumario 1 Introducao ao tratamento de excecoes 2 Definindo uma classe de excecoes 3 Ocorrˆencia do tratamento de excecoes 4 Relancando uma excecao 5 Especificacoes de excecao 6 Excecoes e heranca 7 Processando falhas new 8 Classe auto ptr e alocacao de memoria dinˆamica 9 Hierarquia de excecoes da bibliotecapadrao 10 Exercıcio 11 Referˆencias Tratamento de excecoes Introducao ao tratamento de excecoes Introducao ao tratamento de excecoes Uma excecao e uma indicacao de um problema que ocorre durante a execucao de um programa O nome excecao da a entender que o problema ocorre raramente se a regra e que uma instrucao execute geralmente de modo correto entao a excecao a regra e que um problema ocorra Os recursos apresentados neste topico permitem aos programadores escrever programas robustos e tolerantes a falhas capazes de lidar com possıveis problemas e continuar executando ou terminar elegantemente Tratamento de excecoes Introducao ao tratamento de excecoes Visao geral do tratamento de excecoes A logica do programa frequentemente testa condicoes que determinam como a execucao do programa prossegue Considere o seguinte pseudocodigo Realize uma tarefa Se a tarefa anterior nao tiver sido executada corretamente Realize processamento de erro Realize a proxima tarefa Se a tarefa anterior nao tiver sido executada corretamente Realize processamento de erro Tratamento de excecoes Definindo uma classe de excecoes Definindo uma classe de excecoes para representar o tipo de problema que poderia ocorrer Vamos definir a classe DivideByZeroException como uma classe derivada de classe da Standard Library runtime error definida no arquivo de cabecalho stdexcept A classe runtime error uma classe derivada da classe exception da Standard Library definida no arquivo de cabecalho exception e a classe basica padrao C para representar erros de tempo de execucao A classe exception e a classe basica padrao C para todas as excecoes Uma classe de excecoes tıpica que deriva da classe runtime error define somente um construtor que passa uma string de mensagem de erro ao construtor runtime error da classe basica Cada classe de excecoes que deriva direta ou indiretamente de exception contem a funcao virtual what que retorna a mensagem de erro da excecao Tratamento de excecoes Definindo uma classe de excecoes Definindo uma classe de excecoes para representar o tipo de problema que poderia ocorrer Cont Definicao da classe DivideByZeroException Arquivo DivideByZeroExceptionh include stdexcept biblioteca que contem runtime error using stdruntime error da bibliotecapadrao do C objetos DivideByZeroException devem ser lancados por funcoes ao detectar excecoes de divisao por zero class DivideByZeroException public runtime error public construtor especifica a mensagem de erropadrao DivideByZeroExceptionDivideByZeroException runtime error attempted to divide by zero fim da classe DivideByZeroException Tratamento de excecoes Definindo uma classe de excecoes Incluindo o codigo em blocos trycatch O C fornece blocos try para permitir o tratamento de excecoes Um bloco try consiste na palavrachave try seguida por chaves que definem um bloco de codigo em que as excecoes poderiam ocorrer O bloco try inclui instrucoes que poderiam causar excecoes e instrucoes que devem ser ignoradas se ocorrer uma excecao As excecoes sao processadas por handlers catch que capturam e tratam excecoes Pelo menos um handler catch deve imediatamente seguir cada bloco try Cada handler catch inicia com a palavra chave catch e especifica em parˆenteses um parˆametro de excecao que representa o tipo de excecao que o handler catch pode processar DivideByZeroException neste caso Tratamento de excecoes Definindo uma classe de excecoes Incluindo o codigo em blocos trycatch Cont Se ocorrer uma excecao como o resultado de uma instrucao em um bloco try o bloco try expira isto e termina imediatamente Em seguida o programa procura o primeiro handler catch que pode processar o tipo de excecao que ocorreu O programa localiza o catch correspondente comparando o tipo de excecao lancado com o tipo de parˆametro de excecao de cada catch ate encontrar uma correspondˆencia Ocorre uma correspondˆencia se os tipos forem idˆenticos ou se o tipo da excecao lancada for uma classe derivada do tipo de parˆametro de excecao Quando ocorre uma correspondˆencia o codigo contido no handler catch correspondente executa Quando um handler catch termina o processamento alcancando sua chave de fechamento direita a excecao e considerada tratada e as variaveis locais definidas dentro do handler catch incluindo o parˆametro catch saem do escopo Tratamento de excecoes Definindo uma classe de excecoes Incluindo o codigo em blocos trycatch Cont 2 Exemplo de tratamento de excecoes que verifica excecoes de divisao por zero Arquivo Fig16 02cpp include iostream using stdcin using stdcout using stdendl include DivideByZeroExceptionh realiza a divisao e lanca o objeto DivideByZeroException se a excecao de divisao por zero ocorrer Tratamento de excecoes Definindo uma classe de excecoes Incluindo o codigo em blocos trycatch Cont 3 double quotient int numerator int denominator lanca DivideByZeroException se tentar dividir por zero if denominator 0 throw DivideByZeroException termina a funcao retorna resultado da divisao return static castdouble numerator denominator fim da funcao quotient int main int number1 numerador especificado pelo usuario int number2 denominador especificado pelo usuario double result resultado da divisao Tratamento de excecoes Definindo uma classe de excecoes Incluindo o codigo em blocos trycatch Cont 4 cout Enter two integers end of file to end permite ao usuario inserir dois inteiros para dividir while cin number1 number2 bloco try contem codigo que poderia lancar excecao e codigo que nao deve executar se uma excecao ocorrer try result quotient number1 number2 cout The quotient is result endl fim do try Tratamento de excecoes Definindo uma classe de excecoes Incluindo o codigo em blocos trycatch Cont 5 handler de excecao trata uma excecao de divisao por zero Dica de desempenho Capturar um objeto de excecao por referˆencia elimina o overhead de copiar o objeto que representa a excecao lancada catch DivideByZeroException divideByZeroException cout Exception occurred divideByZeroExceptionwhat endl fim do catch cout Enter two integers endoffile to end fim do while cout endl return 0 termina normalmente fim de main Tratamento de excecoes Ocorrˆencia do tratamento de excecoes Ocorrˆencia do tratamento de excecoes O tratamento de excecoes e um processo projetado para erros sıncronos que ocorrem quando uma instrucao executa Exemplos comuns desses erros sao subscritos de array fora do intervalo overflow aritmetico valor fora do intervalo divisao por zero parˆametros de funcao invalidos e alocacao de memoria malsucedida E tambem utizado para processar problemas que ocorrem quando um programa interage com elementos de software como funcoesmembro construtores destrutores e classes O tratamento de excecoes nao e projetado para processar erros associados com os eventos assıncronos ES de disco chegadas de mensagem de rede cliques de mouse e pressionamentos de tecla que ocorrem em paralelamente eou independente do fluxo de controle do programa As funcoes com condicoes de erro comuns devem retornar 0 ou NULL ou outros valores adequados Tratamento de excecoes Relancando uma excecao Relancando uma excecao E possıvel que um handler de excecao no recebimento de uma excecao decida que nao pode processar essa excecao ou que pode processala apenas parcialmente Nesses casos o handler de excecao pode adiar o tratamento de excecoes ou talvez uma parte dele para outro handler de excecao Em qualquer caso o handler alcanca isso relancando a excecao via a instrucao throw Independentemente de um handler poder ou nao processar mesmo parcialmente uma excecao o handler pode relancala para processamento adicional fora do handler O proximo bloco try envolvente detecta a excecao relancada que um handler catch listado depois desse bloco try envolvente tenta tratar Tratamento de excecoes Relancando uma excecao Relancando uma excecao Cont Demonstrando o relancamento de excecao include iostream using stdcout using stdendl include exception using stdexception lanca captura e relanca a excecao void throwException lanca a excecao e a captura imediatamente try cout Function throwException throws an exception throw exception gera a excecao fim do try Tratamento de excecoes Relancando uma excecao Relancando uma excecao Cont 2 catch exception trata a excecao cout Exception handled in function throwException Function throwException rethrows exception throw relanca a excecao para processamento adicional fim do catch cout This also should not print fim da funcao throwException int main lanca a excecao Tratamento de excecoes Relancando uma excecao Relancando uma excecao Cont 3 try cout main invokes function throwException throwException cout This should not print fim do try catch exception trata a excecao cout Exception handled in main fim do catch cout Program control continues after catch in main return 0 fim de main Tratamento de excecoes Relancando uma excecao Relancando uma excecao Cont 4 Apresentacao na tela main invokes function throwException Function throwException throws an exception Exception handled in function throwException Function throwException rethrows exception Exception handled in main Program control continues after catch in main Tratamento de excecoes Especificacoes de excecao Especificacoes de excecao especificacao de excecao opcional tambem chamada lista throw enumera uma lista de excecoes que uma funcao pode lancar Por exemplo considere a declaracao de funcao int someFunction double value throw ExceptionA ExceptionB ExceptionC corpo da funcao Uma funcao pode lancar somente excecoes dos tipos indicados pela especificacao ou excecoes de qualquer tipo derivado desses tipos Se a funcao lanca uma excecao que nao pertence a um tipo especificado a funcao unexpected e chamada o que normalmente termina o programa Tratamento de excecoes Especificacoes de excecao Especificacoes de excecao Cont Uma funcao que nao fornece uma especificacao de excecao pode lancar qualquer excecao Colocar throw uma especificacao de excecao vazia depois da lista de parˆametros de uma funcao declara que a funcao nao lanca excecoes e se a funcao tentar lancar uma excecao a funcao unexpected e invocada o que normalmente termina o programa Tratamento de excecoes Especificacoes de excecao Processando excecoes inesperadas A funcao unexpected chama a funcao registrada junto a funcao set unexpected definida no arquivo de cabecalho exception Se nenhuma funcao foi registrada dessa maneira a funcao terminate e chamada por padrao A funcao set terminate pode especificar a funcao a ser invocada quando terminate for chamada Caso contrario terminate chama abort que termina o programa sem chamar os destrutores de quaisquer objetos restantes da classe de armazenamento automatico ou estatico Isso poderia levar a vazamentos de recurso quando um programa termina prematuramente A funcao set terminate e a funcao set unexpected retornam um ponteiro para a ultima funcao chamada por terminate e unexpected Isso permite ao programador salvar o ponteiro de funcao para que possa ser restaurado mais tarde Tratamento de excecoes Excecoes e heranca Excecoes e heranca Varias classes de excecoes podem ser derivadas de uma classe basica comum tal como em DivideByZeroException que consiste em uma classe derivada da classe exception Se um handler catch captura um ponteiro ou referˆencia para um objeto de excecao de um tipo de classe basica ele tambem pode capturar um ponteiro ou referˆencia para todos os objetos de classes publicamente derivadas dessa classe basica isso permite processamento polimorfico de erros relacionados Tratamento de excecoes Processando falhas new Processando falhas new O C padrao especifica que quando o operador new falha ele lanca uma excecao bad alloc definida no arquivo de cabecalho new Entretanto alguns compiladores nao sao compatıveis com o padrao C e portanto utilizam a versao de new que retorna 0 em caso de falha Por exemplo o Microsoft Visual Studio NET lanca uma excecao bad alloc quando new falha enquanto o Microsoft Visual C 60 retorna 0 em caso de falha de new Tratamento de excecoes Processando falhas new Exemplo de new retornando 0 em caso de falha A instrucao for deve fazer o loop 50 vezes e em cada passagem alocar um array de 50000000 valores double isto e 400000000 de bytes porque um double tem normalmente 8 bytes A instrucao if testa o resultado de cada operacao new para determinar se new alocou a memoria com sucesso Se new falhar e retornar 0 ocorre a impressao uma mensagem de erro e o loop termina Utilizase o Microsoft Visual C 60 para executar esse exemplo porque ele lanca 0 em caso de falha de new em vez de retornar uma excecao bad alloc Tratamento de excecoes Processando falhas new Exemplo de new retornando 0 em caso de falha Cont Demonstrando new prepadrao retornando 0 quando a memoria e alocada Arquivo Fig16 05cpp include iostream using stdcerr using stdcout int main double ptr 50 Tratamento de excecoes Processando falhas new Exemplo de new retornando 0 em caso de falha Cont 2 aloca memoria para ptr for int i 0 i 50 i ptr i new double 50000000 if ptr i 0 fez new falhar na alocacao de memoria cerr Memory allocation failed for ptr i break fim do if else alocacao bemsucedida de memoria cout Allocated 50000000 doubles in ptr i fim do for return 0 fim de main Tratamento de excecoes Processando falhas new Exemplo de new retornando 0 em caso de falha Cont 3 Allocated 50000000 doubles in ptr 0 Allocated 50000000 doubles in ptr 1 Allocated 50000000 doubles in ptr 2 Memory allocation failed for ptr 3 sai do programa com break Tratamento de excecoes Processando falhas new Exemplo de new lancando bad alloc O exemplo demonstra new lancando bad alloc em caso de falha em alocar a memoria solicitada A instrucao for dentro do bloco try deve fazer um loop 50 vezes e em cada passagem alocar um array de 50000000 valores double Se new falha e lanca uma excecao bad alloc o loop termina e o programa continua onde o handler catch captura e processa a excecao Perante a excessao o programa imprime na tela a mensagem Exception occurred seguida pela mensagem retornada da versao da classe basica exception da funcao what isto e uma mensagem especıfica a excecao definida pela implementacao como Allocation Failure no Microsoft Visual Studio NET 2003 Tratamento de excecoes Processando falhas new Exemplo de new lancando bad alloc Cont Demonstrando newpadrao lancando bad alloc quando a memoria pode ser alocada Arquivo Fig16 06cpp include iostream using stdcerr using stdcout using stdendl include new operador new padrao using stdbad alloc int main double ptr 50 aloca memoria para ptr try Tratamento de excecoes Processando falhas new Exemplo de new lancando bad alloc Cont 2 aloca memoria para ptri new lanca bad alloc em caso de falha for int i 0 i 50 i ptr i new double 50000000 pode lancar excecao cout Allocated 50000000 doubles in ptr i fim do for fim do try trata excecao bad alloc catch bad alloc memoryAllocationException cerr Exception occurred memoryAllocationExceptionwhat endl fim do catch return 0 fim de main Tratamento de excecoes Processando falhas new Exemplo de new lancando bad alloc Cont 3 Allocated 50000000 doubles in ptr 0 Allocated 50000000 doubles in ptr 1 Allocated 50000000 doubles in ptr 2 Exception occurred bad allocation Tratamento de excecoes Processando falhas new New em C padrao que retorna 0 em caso de falha O C padrao especifica que compiladores compatıveis com o padrao podem continuar a utilizar uma versao de new que retorna 0 em caso de falha Para esse proposito o arquivo de cabecalho new define o objeto nothrow de tipo nothrow t Que ao ser aplicada em uma instrucao utiliza a versao de new que nao lanca excecoes bad alloc isto e nothrow Ex double ptr new nothrow double 50000000 Tratamento de excecoes Processando falhas new Tratando falhas new com a funcao set new handler Um recurso adicional para tratar falhas de new e a funcao set new handler prototipada no arquivo de cabecalhopadrao new Essa funcao aceita como seu argumento um ponteiro para uma funcao que nao aceita argumentos e retorna void Esse ponteiro aponta para a funcao que sera chamada se new falhar Isso fornece ao programador uma abordagem uniforme para tratar todas as falhas de new independentemente de onde uma falha ocorra no programa Uma vez que set new handler registra um handler de new no programa o operador new nao lanca bad alloc em caso de falha em vez disso ele adia o tratamento de erro para a funcao do handler de new Tratamento de excecoes Processando falhas new falhas new com a funcao set new handler Cont Ex Demonstrando set new handler Arquivo Fig16 07cpp include iostream using stdcerr using stdcout include new operador newpadrao e set new handler using stdset new handler include cstdlib prototipo da funcao abort using stdabort Tratamento de excecoes Processando falhas new Tratando falhas new com a funcao set new handler Cont 2 trata falha de alocacao de memoria void customNewHandler cerr customNewHandler was called abort fim da funcao customNewHandler utilizando set new handler para tratar alocacao malsucedida int main double ptr 50 especifica que customNewHandler deve ser chamado em caso de falha na alocacao de memoria set new handler customNewHandler Tratamento de excecoes Processando falhas new Tratando falhas new com a funcao set new handler Cont 3 aloca memoria para ptri customNewHandler sera chamado na falha na alocacao de memoria for int i 0 i 50 i ptr i new double 50000000 pode lancar excecao cout Allocated 50000000 doubles in ptr i fim do for return 0 fim de main Tratamento de excecoes Processando falhas new Tratando falhas new com a funcao set new handler Cont 4 Allocated 50000000 doubles in ptr 0 Allocated 50000000 doubles in ptr 1 Allocated 50000000 doubles in ptr 2 customNewHandler was called Tratamento de excecoes Classe auto ptr e alocacao de memoria dinˆamica Classe auto ptr e alocacao de memoria dinˆamica Uma pratica de programacao comum e alocar memoria dinˆamica atribuir o endereco dessa memoria a um ponteiro utilizar o ponteiro para manipular a memoria e desalocar a memoria com delete quando ela nao for mais necessaria Se ocorrer uma excecao depois da alocacao de memoria bem sucedida mas antes de a instrucao delete executar um vazamento de memoria poderia ocorrer O padrao C fornece o template da classe auto ptr no arquivo de cabecalho memory para lidar com essa situacao Um objeto da classe auto ptr mantem um ponteiro para a memoria dinamicamente alocada Quando um destrutor de objeto auto ptr e chamado por exemplo quando um objeto auto ptr sai de escopo ele realiza uma operacao delete em seu membro de dados de ponteiro Tratamento de excecoes Classe auto ptr e alocacao de memoria dinˆamica Classe auto ptr e alocacao de memoria dinˆamica Cont Definicao da classe Integer Arquivo Integerh class Integer public Integer int i 0 construtorpadrao Integer Integer destrutor Integer void setInteger int i funcao para configurar Integer int getInteger const funcao para retornar Integer private int value fim da classe Integer Tratamento de excecoes Classe auto ptr e alocacao de memoria dinˆamica Classe auto ptr e alocacao de memoria dinˆamica Cont 2 Ex Definicao da funcaomembro Integer Arquivo Integercpp include iostream using stdcout using stdendl include Integerh construtorpadrao Integer IntegerInteger int i value i cout Constructor for Integer value endl fim do construtor Integer Tratamento de excecoes Classe auto ptr e alocacao de memoria dinˆamica Classe auto ptr e alocacao de memoria dinˆamica Cont 3 destrutor Integer Integer Integer cout Destructor for Integer value endl fim do destrutor Integer configura o valor Integer void IntegersetInteger int i value i fim da funcao setInteger Tratamento de excecoes Classe auto ptr e alocacao de memoria dinˆamica Classe auto ptr e alocacao de memoria dinˆamica Cont 4 retorna o valor Integer int IntegergetInteger const return value fim da funcao getInteger Tratamento de excecoes Classe auto ptr e alocacao de memoria dinˆamica Classe auto ptr e alocacao de memoria dinˆamica Cont 5 Ex Demonstrando auto ptr Arquivo Fig16 10cpp include iostream using stdcout using stdendl include memory using stdauto ptr definicao da classe auto ptr include Integerh utiliza auto ptr para manipular o objeto Integer int main cout Creating an auto ptr object that points to an Integer Tratamento de excecoes Classe auto ptr e alocacao de memoria dinˆamica Classe auto ptr e alocacao de memoria dinˆamica Cont 6 aponta auto ptr para o objeto Integer auto ptr Integer ptrToInteger new Integer 7 cout Using the auto ptr to manipulate the Integer ptrToIntegersetInteger 99 usa auto ptr utiliza auto ptr para obter o valor Integer cout Integer after setInteger ptrToIntegergetInteger return 0 fim de main Tratamento de excecoes Hierarquia de excecoes da bibliotecapadrao Hierarquia de excecoes da bibliotecapadrao Figure 1 Classes de excecoes da bibliotecapadrao Tratamento de excecoes Exercıcio Exercıcio 81 sem efeito Experimentando os exemplos fornecidos Execute os codigosfonte dos seguintes exemplos fornecidos nesta unidade e analise cuidadosamente os erros apontados pelo compilador e aponte a solucao em cada caso Arquivos de codigos que deverao ser implementados Fig16 02cpp Tratamento de excecoes Exercıcio Exercıcio 82 Incluir tratamento de excessao a pelo menos uma das contas de investimento Quando realizada uma aplicacao o saldo da conta nao pode ficar zerada nem negativa Se isso ocorrer o aplicativo deve lancar uma excessao que informe ao usuario que o valor da aplicacao esta fora da faixa aceitavel e devolver ao usuario a possibilidade de escolher novo valor para o investimento sem alterar o saldo da conta O programa deve possuir sua propria classe de excessao a ser lancada disponıvel atraves de uma biblioteca propria Tratamento de excecoes Referˆencias Referˆencias HM Deitel PJ Deitel C como programar 5a ed Sao Paulo Pearson Prentice Hall 2006 Antonio Mendes da Silva Filho Introducao a programacao orientada a objetos com C Rio de Janeiro Elsevier 2010 Victorine Viviane Mizrahi Treinamento em linguagem C Modulo 2 Sao Paulo Makron Books 2001