Baixe o app para aproveitar ainda mais
Prévia do material em texto
Capítulo 14 Tratamento de Exceções e Tratamento de Eventos Conceitos de Linguagens de Programação – Robert W. Sebesta Tópicos do Capítulo 14 Introdução ao tratamento de exceções Tratamento de exceções em Ada Tratamento de exceções em C++ Tratamento de exceções em Java Introdução ao tratamento de eventos Tratamento de eventos com Java Conceitos de Linguagens de Programação – Robert W. Sebesta Introdução ao tratamento de exceções Em uma linguagem sem tratamento de exceção Quando ocorre uma exceção, o controle vai para o sistema operacional, onde uma mensagem é exibida e o programa é encerrado Em uma linguagem com tratamento de exceção Os projetistas incluíram mecanismos que permitem aos programas reagir de maneira padrão a certos erros em tempo de execução, podendo corrigir o problema e continuar Conceitos de Linguagens de Programação – Robert W. Sebesta Conceitos básicos Uma exceção é qualquer evento não usual, errôneo ou não, que é detectável por hardware ou por software que possam requerer um processamento especial O processamento especial que pode ser requerido quando uma exceção é detectada é chamado de tratamento de exceção Esse processamento é feito por uma unidade de código ou por um segmento chamado de tratador de exceção Conceitos de Linguagens de Programação – Robert W. Sebesta Alternativas ao tratamento de exceções Uma exceção é levantada quando seu evento associado ocorre Uma linguagem que não tem recursos de tratamento de exceções ainda pode definir, detectar e tratar exceções (definidas pelo usuário, detectadas por software) Alternativas: Um projeto possível é enviar um parâmetro auxiliar, que é usado como uma variável de estado Outra possibilidade é passar um rótulo como parâmetro para o subprograma Uma terceira possibilidade é ter o tratador definido como um subprograma separado, cujo nome é passado como um parâmetro para a unidade chamada Conceitos de Linguagens de Programação – Robert W. Sebesta Vantagens do tratamento de exceções nas linguagens Sem tratamento de exceções, o código necessário para detectar condições de erro pode ser muito confuso em um programa O tratamento de exceções incentiva programadores a considerar diversos possíveis erros A propagação de exceções permite que um único tratador seja usado por qualquer número de diferentes unidades de programa Conceitos de Linguagens de Programação – Robert W. Sebesta Questões de projeto Como e onde os tratadores de exceções são especificados e qual o seu escopo? Como uma ocorrência de uma exceção é vinculada a um tratador de exceção? A informação acerca de uma exceção pode ser passada para o tratador? Onde a execução continua, se é que continua, após um tratador de exceção completar sua execução? (Essa é a questão da continuação ou reinício) Alguma forma de finalização é fornecida? Conceitos de Linguagens de Programação – Robert W. Sebesta Questões de projeto Como as exceções definidas pelo usuário são especificadas? Se existem exceções pré-definidas, devem existir tratadores de exceção padronizados para programas que não forneçam os seus? As exceções pré-definidas podem ser explicitamente levantadas? Os erros detectáveis por hardware são considerados exceções que devem ser tratadas? Existe alguma exceção pré-definida? Deve ser possível desabilitar exceções pré-definidas? Conceitos de Linguagens de Programação – Robert W. Sebesta Fluxo de controle de tratamento de exceções Conceitos de Linguagens de Programação – Robert W. Sebesta Tratamento de exceções em Ada Os tratadores de exceção podem ser incluídos em blocos ou em corpos de subprogramas, pacotes ou tarefas Como os tratadores de exceção são geralmente locais ao código em que a exceção pode ser levantada, eles não têm parâmetros Conceitos de Linguagens de Programação – Robert W. Sebesta Tratamento de exceções em Ada Forma geral do tratador: when escolha_da_exceção{|escolha_da_exceção} => sequência_de_sentenças ... [when others => sequência_de_sentenças] escolha_de_exceção tem a forma: nome_da_exceção | others Tratadores são colocados no final do bloco ou unidade em que aparecem Conceitos de Linguagens de Programação – Robert W. Sebesta Vinculando exceções a tratadores Se uma exceção é levantada em um bloco ou unidade que não tem um tratador para essa exceção em particular, ela é propagada para algum outro bloco ou unidade Procedimento – propaga a exceção para o chamador Blocos - propaga até o próximo escopo estático maior que envolve o bloco Corpo de pacote - propaga para a seção de declaração da unidade contendo a declaração de pacote (se o pacote é uma unidade de biblioteca, o programa é terminado) Tarefa – sem propagação; se não tiver um tratador, a tarefa é marcada como “completa” Conceitos de Linguagens de Programação – Robert W. Sebesta Continuação O bloco ou unidade que levanta uma exceção, mas não a manipularam, é sempre terminado. O controle nunca retorna implicitamente para o bloco ou unidade que levantou a exceção após esta ser tratada Conceitos de Linguagens de Programação – Robert W. Sebesta Outras escolhas de projeto Exceções definidas pelo usuário: lista_de_nomes_da_exceção : exception; Exceções com sentença raise: raise [nome_da_exceção] (o único lugar onde uma sentença raise pode aparecer sem nomear uma exceção é dentro de um tratador de exceção) Condições de exceção podem ser desabilitadas com: pragma SUPPRESS(nome_da_verificação) Conceitos de Linguagens de Programação – Robert W. Sebesta Exceções pré-definidas CONSTRAINT_ERROR – restrições de índice, restrições de intervalo etc. NUMERIC_ERROR - operação numérica não pode retornar um valor correto (divisão por zero etc.) PROGRAM_ERROR - chamada a um subprograma cujo corpo não foi elaborado STORAGE_ERROR – acaba a memória no monte do sistema TASKING_ERROR - um erro associado a tarefas Conceitos de Linguagens de Programação – Robert W. Sebesta Avaliação O projeto de Ada para tratamento de exceções representa algo como um consenso, ao menos na época de seu projeto (final dos anos 1970 e início dos anos 1980), sobre as ideias acerca do tema Até ser adicionado a C++, Ada foi a única linguagem amplamente usada que incluía tratamento de exceções Conceitos de Linguagens de Programação – Robert W. Sebesta Tratamento de exceções em C++ Adicionado ao C++ em 1990 Projeto baseado no tratamento de exceções de CLU, Ada e ML Conceitos de Linguagens de Programação – Robert W. Sebesta Tratadores de exceção em C++ Forma geral do tratador: try { -- código que pode levantar uma exceção } catch (formal parameter) { -- corpo de um tratador } ... catch (formal parameter) { -- corpo de um tratador } Conceitos de Linguagens de Programação – Robert W. Sebesta A função catch Cada função catch é um tratador de exceção e pode ter apenas um parâmetro formal, que é similar a um em uma definição de função em C++, incluindo a possibilidade de ser reticências Um tratador com um parâmetro formal que é um sinal de reticências captura todas as exceções; ele é usado por qualquer exceção levantada se nenhum tratador apropriado for encontrado O parâmetro formal também pode ser um especificador de tipo, como float, como no protótipo da função Conceitos de Linguagens de Programação – Robert W. Sebesta Vinculando exceções a tratadores Exceções em C++ são levantadas apenas por meio da sentença explícita throw, cuja forma geral em EBNF é : throw [expression]; Os colchetes aqui são metassímbolos Um throw sem um operando pode aparecer apenas em um tratador. Quando aparecer lá, ele relança a exceção, que é então tratada em outro lugar O tipo da expressão seleciona o tratador particular, que deve ter um parâmetro que “case” com o tipo da expressão Conceitos de Linguagens de Programação – Robert W. Sebesta Exceções não tratadas Uma exceção não tratada é propagadapara o chamador da função em que ela é levantada A propagação continua até a função principal Se nenhum tratador é encontrado, o tratador padrão será chamado Conceitos de Linguagens de Programação – Robert W. Sebesta Continuação Após um tratador ter completado sua execução, o controle flui para a primeira sentença após a construção try (a sentença logo após o último tratador na sequência de tratadores do qual ela é um elemento) Outras escolhas de projeto Todas as exceções são definidas pelo usuário Exceções não são especificadas nem declaradas O tratador padrão, unexpected, simplesmente termina o programa; ele pode ser substituído por um tratador definido pelo usuário Funções podem listar as exceções que pode levantar Sem uma especificação, uma função pode levantar qualquer exceção Conceitos de Linguagens de Programação – Robert W. Sebesta Avaliação Não existem exceções detectáveis por hardware pré-definidas que possam ser tratadas pelo usuário, e as exceções não são nomeadas O tipo do parâmetro formal de um tratador determina as condições nas quais ele é chamado, mas pode não ter nada a ver com a natureza da exceção levantada. Logo, o uso de tipos pré-definidos de exceções não promove a legibilidade Conceitos de Linguagens de Programação – Robert W. Sebesta Tratamento de exceções em Java Baseado no de C++, mas projetado para estar mais alinhado com o paradigma de linguagem orientada a objeto Todas as exceções em Java são objetos de classes descendentes de Throwable Conceitos de Linguagens de Programação – Robert W. Sebesta Classes de exceções O sistema Java inclui duas classes de exceção pré-definidas, subclasse de Throwable : Error Relacionadas a erros que são lançados pela Máquina Virtual Java, como não ter mais memória no monte Nunca lançadas por programas de usuários Exception Exceções definidas pelo usuário são geralmente subclasses desta Tem duas subclasses pré-definidas, IOException e RuntimeException (por exemplo, ArrayIndexOutOfBoundsException e NullPointerException Conceitos de Linguagens de Programação – Robert W. Sebesta Tratadores de exceção Em Java, têm a mesma forma dos de C++, exceto que cada catch deve ter um parâmetro e a classe do parâmetro deve ser um descendente da classe Throwable A sintaxe da construção try é exatamente igual à de C++ Uma instância da classe de exceção é fornecida como o operando da sentença throw Conceitos de Linguagens de Programação – Robert W. Sebesta Vinculando exceções a tratadores Vincular uma exceção a um tratador é mais simples em Java do que em C++ Uma exceção é vinculada ao primeiro tratador cujo parâmetro é a mesma classe do objeto lançado ou um ancestral dela Exceções podem ser tratadas e então relançadas ao incluir uma sentença throw sem um operando no final do tratador Conceitos de Linguagens de Programação – Robert W. Sebesta Continuação Se nenhum tratador é encontrado na construção try , a busca continua na construção try mais próxima. Se nenhum tratador é encontrado em um método, a exceção é propagada para o chamador do método If no handler is found in the method, the exception is propagated to the method’s caller Se nenhum tratador é encontrado (em todo o caminho até main), o programa é terminado If no handler is found (all the way to main), the program is terminated Para garantir que todas as exceções são capturadas, m manipulador pode ser incluída em qualquer construção try To insure that all exceptions are caught, a handler can be included in any try construct that catches all exceptions Simply use an Exception class parameter Simplesmente utilize a classe derivada Exception Of course, it must be the last in the try construct É claro, ele deve ser a última contrução try Conceitos de Linguagens de Programação – Robert W. Sebesta Exceções verificadas e não verificadas A cláusula throws de Java é bastante diferente da de C++ Exceções das classes Error e RunTimeException e suas descendentes são chamadas de exceções não verificadas; todas as outras são exceções verificadas As exceções verificadas que podem ser acionadas por um método deve ser : Listadas na cláusula throws ou Tratadas no método Conceitos de Linguagens de Programação – Robert W. Sebesta Outras escolhas de projeto Um método não pode declarar mais exceções em sua cláusula throws do que o método que ele sobrescreve Um método que chama um método que lista uma exceção verificada em particular em sua cláusula throws tem três alternativas para lidar com essa exceção: Capturar a exceção e tratá-la Capturar a exceção e lançar uma exceção listada em sua própria cláusula throws Declarar a exceção em sua cláusula throws e não tratá-la Conceitos de Linguagens de Programação – Robert W. Sebesta A cláusula finally Pode aparecer no fim de uma construção try Forma: finally { ... } Propósito: especificar o código que será executado, independentemente do que acontece na construção try Conceitos de Linguagens de Programação – Robert W. Sebesta Exemplo Uma construção try com uma cláusula finally pode ser usada fora do tratamento de exceções try { for (index = 0; index < 100; index++) { … if (…) { return; } //** fim do if } //** fim da cláusula try finally { … } //** fim da construção try Conceitos de Linguagens de Programação – Robert W. Sebesta Asserções Sentenças no programa que declaram uma expressão booleana em relação ao atual estado da computação Quando avaliada como verdadeira, nada acontece Quando avaliada como falsa, uma AssertionError é lançada Pode ser desabilitada durante o tempo de execução sem modificação no programa Duas formas assert condição; assert condição: expressão; Conceitos de Linguagens de Programação – Robert W. Sebesta Avaliação Os mecanismos de Java para tratamento de exceções são melhorias em relação à versão de C++ A cláusula throws é melhor do que em C++ (Em C++, ela diz pouco ao programador) A cláusula finally é frequentemente útil O interpretador Java gera uma série de exceções que podem ser manipulados pelos programas do usuário Conceitos de Linguagens de Programação – Robert W. Sebesta Introdução ao tratamento de eventos Um evento é uma notificação de que algo ocorreu, como um clique de mouse em um botão gráfico Um tratador de evento é um segmento de código executado em resposta a aparição de um evento Conceitos de Linguagens de Programação – Robert W. Sebesta Componentes de GUI do Java Swing Uma caixa de texto e um objeto da classe JTextField O construtor de JRadioButton é usado para criar os botões de rádio Uma visualização de um applet é, na verdade, um frame, uma estrutura com múltiplas camadas. O painel de conteúdo é onde os applets colocam suas saídas Componentes GUI podem ser colocados em um frame Conceitos de Linguagens de Programação – Robert W. Sebesta O modelo de eventos de Java Interações de usuários com componentes GUI criam eventos que podem ser capturados por tratadores de eventos, chamados de escutadores de eventos Um gerador de eventos informa a um escutador de evento pelo envio de uma mensagem (chamando um dos métodos deste) Uma interface prescreve protocolos de métodos padronizados, mas não fornecem implementações desses métodos Conceitos de Linguagens de Programação – Robert W. Sebesta O modelo de eventos de Java Uma classe de eventos é ItemEvent, que é associada com o evento de selecionar uma caixa de verificação, um botão de rádio ou um item de lista A interface ItemListener prescreve um método, itemStateChanged, que é o tratador de eventos ItemEvent O escutador é criado com addItemListener Conceitos de Linguagens de Programação – Robert W. Sebesta Resumo Ada fornece extensivos recursos de tratamento de exceções e uma coleção pequena, mas completa de exceções pré-definidas C++ não inclui exceções pré-definidas. As exceções são vinculadas aos tratadores ao conectarmos o tipoda expressão na sentença throw com o tipo do parâmetro formal do tratador Exceções em Java são similares às em C++, exceto que em Java elas devem ser descendentes da classe Throwable. Java inclui ainda a cláusula finally Um evento é uma notificação de que algo que precisa de tratamento ocorreu *
Compartilhar