Baixe Java - Slides 08 - Exceções e outras Slides em PDF para Programação para Java, somente na Docsity!
Linguagens de Programação
8 – Exceções
Vítor E. Silva Souza ([email protected]) http://www.inf.ufes.br/~vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Este obra foi licenciada sob uma Licença Creative Commons Atribuição 3.0 Não Adaptada.
Conteúdo do curso
- Introdução;
- Amarrações;
- Valores e tipos de dados;
- Variáveis e constantes;
- Expressões e comandos;
- Modularização;
- Polimorfismo;
- Exceções;
- Concorrência;
- Avaliação de linguagens.
- Estes slides foram baseados em:
- Slides do prof. Flávio M. Varejão;
- Livro “Linguagens de Programação – Conceitos e Técnicas” (Varejão);
- Livro “Linguagens de Programação – Princípios e Paradigmas, 2a edição” (Tucker & Noonan).
Causas de exceções
Exceções Erros Hardware Software Fluxo Múltiplos resultados
- Erros de hardware:
- Ex.: falha no disco rígido;
- Erros de software:
- Ex.: acesso a índice inexistente de vetor;
- Múltiplos resultados:
- Ex.: leitura de registro ou fim de arquivo.
Abordagens de LPs para exceções
- Não oferecer recursos próprios:
- Tratamento através de mecanismos já existentes (testes, subprogramas e desvio incondicional);
- Ex.: C, Pascal e Modula-‐2;
- Possuir mecanismo de tratamento de exceções:
- Comandos específicos;
- Novo tipo de fluxo de execução;
- Ex.: Ada, C++ e Java.
Abortar
- Reduz a confiança do usuário no sistema;
- Pode levar a prejuízos financeiros…
- Dificulta a depuração dos erros;
- Muitas exceções podem ser contornadas sem que seja necessário interromper a execução do programa.
Teste e tratamento imediato
- Carrega muito o texto do programa com código de tratamento: - Obscurece a funcionalidade do algoritmo com testes de exceções; - Subprogramas para tratamento reduzem esse problema;
- Programador tem de lembrar, identificar e testar todas as possíveis condições causadoras de exceções: - Isso normalmente não ocorre;
- Algumas exceções não podem ser tratadas localmente.
Teste e tratamento imediato
void executaFuncionalidade(int x) { printf ("Faz alguma coisa!!!"); } void f(int x) { if (condicao1(x)) trata1(); if (condicao2(x)) trata2(); if (condicao3(x)) { printf("Nao consegue tratar aqui"); exit(1); } executaFuncionalidade(x); } Quantas linhas de tratamento e quantas de real funcionalidade em f()?
Retorno de código de erro
- Quem chama deve realizar teste e tratamento para cada código de retorno: - Sobrecarga de código fica ainda maior; - Testes no local da exceção e no código de chamada; - Pode duplicar o tamanho de um programa;
- Resolve o problema de tratamento não local da exceção;
- Experiência mostra que o programador não testa todos os códigos de retorno possíveis; - Motivo: não é obrigatório fazê-‐lo;
Retorno de código de erro
- Parâmetro de saída:
- Melhor do que o retorno em variável global ou no resultado da função;
- Nem toda LP dá suporte, pode exigir “gambiarras” (ex.: uso de ponteiros em C);
- Exige inclusão de um novo parâmetro nas chamadas dos subprogramas;
- Requer a propagação desse parâmetro até o ponto de tratamento da exceção;
- Diminui a redigibilidade do código.
Retorno de código de erro
int f(int x) { if (condicao1(x)) return 1; if (condicao2(x)) return 2; if (condicao3(x)) return 3; executaFuncionalidade(x); return 0; } void g() { int resp; resp = f(7); if (resp == 1) trata1(); if (resp == 2) trata2(); if (resp == 3) trata3(); } Qual abordagem foi usada aqui?
Outras opções em C
- Exigem tratamento imediato da exceção;
- Solução signal() concentra o tratamento de todas as exceções em uma única função;
- Solução setjmp() e longjmp() permite localizar o tratamento em qualquer ponto do programa; - Restringe o tratamento ao último setjmp();
- Soluções complexas e com baixa legibilidade;
- Fica a critério do programador C decidir qual a abordagem de tratamento será utilizada.
Mecanismos de tratamento de exceções
- Buscam garantir e estimular o tratamento das condições excepcionais sem que haja uma grande sobrecarga do texto do programa;
- Quando uma exceção ocorre ela necessita ser tratada;
- Tratador de Exceção:
- Bloco ou unidade de código que manipula a exceção;
- Sinalização ou disparo da exceção:
- Ação de indicar a ocorrência da exceção e transferir o controle para o tratador.
Exceções em LPs orientadas a objeto
- Objetos:
- Podem ser lançados para outras partes do programa seguindo um fluxo de controle distinto do usual;
- Classes podem ser especiais ou não;
- Podem/devem ser organizadas dentro de uma hierarquia de classes; - Exemplo em C++: class ErroMedico {}; class ErroDiagnostico: public ErroMedico {}; class ErroCirurgia: public ErroMedico {};
Exceções padrão de C++
exception runtime_error logic_error bad_alloc bad_exception bad_cast bad_typeid ios_base::failure overflow_error out_of_range