Buscar

Sebesta_Texto Cap 14

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
*

Continue navegando