Skip to content

Latest commit

 

History

History
301 lines (224 loc) · 6.86 KB

sistemas.org

File metadata and controls

301 lines (224 loc) · 6.86 KB

Sistema de Tratamento de Exceções

1 Suporte ao tratamento de exceções

Permite separar as partes que devem executar normalmente

daquelas que devem ser executadas apenas em caso de problemas

Vantagens

  • Legibilidade
  • Confiabilidade
  • Encapsulamento
  • Reuso

No caso de problemas

  • Subprograma lança uma exceção

Tratamento pode ser feito em diferentes níveis

2 Sistemas de tratamento de exceções (STE)

Mecanismo oferecido pela linguagem (mais recente)

um STE deve ser capaz de (ou permitir)

  • Detectar a ocorrência de uma situação anormal
  • Identificar o tipo do problema, e Disparar a exceção apropriada
  • Capturar a exceção em algum ponto do programa
  • Ter código de tratamento para Tratar a exceção

3 STE – Questões de Projeto

  1. Como e onde os tratadores de exceção são especificados?
    • Qual seu escopo?
  2. Como a ocorrência de uma exceção é vinculada a um tratador?
  3. Onde a execução continua após o tratamento da exceção?
  4. Há exceções pré-definidas?
  5. Exceções pré-definidas podem ser ativadas explicitamente?
  6. Deve existir tratadores padrão?
  7. Erros detectáveis por hardware são tratados como exceções que podem ser manipuladas?
  8. Deve ser possível desativar exceções?

4 Tipos de Exceções

Pré-definidas (embutidas na linguagem)

Definidas pelo programador, podendo ser

  • Totalmente livres (ML)
  • Criadas com base em exceções existentes \ (Java, Objective-C, C++, …)

Tratáveis

  • Código de tratamento pode ser elaborado
  • Programa pode compensar o erro e seguir em frente

Não-tratáveis

  • Compensação de erro impossível
  • Execução é terminada

Exemplo da linguagem Java (ver documentação de Throwable)

5 Tipos de Exceções

Parametrizáveis

  • A exceção pode carregar parâmetros ao código de tratamento
  • Em linguagem OO, exceções são implementadas como classes

Não-Parametrizáveis

  • Sem parâmetros

Verificadas (checked)

  • Programador deve fornecer código de tratamento

Não-verificadas (unchecked)

  • Não há necessidade de tratamento

Exemplo da linguagem Java (documentação de Throwable)

  • Procurar pour checked

6 Lançamento de exceções

Implicitamente

  • Lançadas pelo ambiente operacional
  • Todas as pré-definidas
    • Divisão por zero
    • Overflow
    • Erros de subscritos
    • Acesso a conteúdo de ponteiro nulo

Explicitamente

  • Lançadas pelo próprio programa
  • Normalmente protegidas por uma condição
    if condicao
       throw minha_excecao
        

Exemplos de lançamento explícito

if (t==NULL) throw new NullPointerException(); //Java
if t<l raise RunTimeError('valor invalido');//Python
if n<0 then raise ValorInvalido; //ML

7 Detecção de exceções

STE oferece um jeito de especificar regiões monitoradas

Comando try em Java/C++

try {
   ...
}

Comando try em Python

try:
   arq = open("arq", "w")
   arq.write("teste")

8 Captura e Tratamento de exceções

STE oferece um jeito de especificar blocos de tratamento

  • Capturam tipos específicos (declarados) de exceção

Comando catch em Java/C++

catch (NumberFormatException e){
  System.out.println ("Entrada Invalida");
}

Comando except em Python

except IOError:
  print "Erro: arquivo não encontrado"

Comando handle em ML

checked_fatorial n handle fatorial
    => print "n invalido"

9 Objetivos do tratador

Compensação do erro

  • Recuperar um estado válido
  • Continuar a execução normal

Se a recuperação não é possível

  • Imprimir uma mensagem de erro significativa
  • Terminar o programa graciosamente

Se a exceção não pode ser tratada no bloco

  • Liberar recursos alocados localmente
  • Propagar a exceção para o bloco chamador

10 Fluxo após o lançamento da exceção

Tratar exceções gera um fluxo de controle alternativo

  • Fluxo excepcional

Exemplo de fluxo de execução normal

//A
try { 
   //B
   num = Integer.parseInt(stdin.readLine());
   valido = true;
}catch (NumberFormatException exc) { 
   //C
   System.out.println(“Entrada invalida.”);
}catch (IOException exc) {
   //D
   System.out.println(“Problema de E/S. Terminando!”);
   System.exit(0); 
}
//E

11 Tratamento local versus não-local

Tratamento local no mesmo subprograma (com try-catch)

Propagação → tratamento em outro ponto do programa

Em java, as exceções verificadas devem ser tratadas localmente

  • O compilador javac garante que o método deve tratá-lo
  • Se não tratadas, devem aparecer no cabeçalho (com throws)
  • Exemplo ./Teste.java

12 Tratamento não-local – Propagação de exceções

Propagação acontece através do encadeamento dinâmico
Registrado em cada registro de ativação na pilha

Para cada subprograma (RA) empilhado que não é tratador

  • RA correspondente é desempilhado
  • Objetos criados são destruídos

No momento que a exceção é tratada

  • Bloco imediatamente posterior ao do tratador é executado

Se nenhum tratador é encontrado

  • Exceção chega ao método principal, que termina o programa
  • Exemplo: Teste.java

13 Propagação e liberação de dados (clean-up)

Para cada subprograma (RA) empilhado que não é tratador

  • RA correspondente é desempilhado
  • Objetos criados são destruídos

C++

  • Exceção sai do escopo ⇒ Chamada de métodos destrutores
  • Totalmente implícito e automático

Java e Python

  • Programador deve escrever o bloco finally

14 Blocos de finalização

Bloco sempre executado, independente se houve exceção

Java: finally

try { ... }
catch (Tipo1 e1) { ... }
catch (Tipo1 e1) { ... }
finally { ... }  

Python: finally/else

try:
except Tipo1:
except Tipo2:
finally:
   #sempre executado
else:
   #executado se não houver exceção