Skip to content

Latest commit

 

History

History
212 lines (164 loc) · 4.52 KB

introducao.org

File metadata and controls

212 lines (164 loc) · 4.52 KB

Motivação e Introdução

1 Programas sem tratamento de exceções

Código de tratamento de erros fica embutido no código

public static void main (String args[]){
  if (args.length != 3){
  println ("Sintaxe: <string> <string> <int>");
  exit(1);
  }
  if (validaArgumento(args[2]) == false){
  println ("Terceiro parâmetro deve ser inteiro.");
  exit(1);
  }
}

Manutenção do código se torna difícil

Não há como prever todos os casos

2 Exceções

Condições inesperadas que surgem durante a execução

Representam situações anormais ou inválidas

Falha na aquisição de um recurso. Exemplos:

  • Abrir um arquivo para saída
  • Alocar memória para um novo objeto

Tentativa de fazer algo impossível ou inválido. Exemplos:

  • Divisão por zero
  • Índice inválido de elemento
  • Lista vazia
  • Overflow

Podem ser detectadas

  • Por hardware (erro de leitura em disco)
  • Por software (acesso a índice fora dos limites do arranjo)

3 Na ausência de exceções

Se a linguagem não der suporte ao seu tratamento?

Problemas detectados pelo hardware → Término imediato do programa

Detectados pelo software, os componentes podem

  • Terminar o programa com código de erro
  • Retornar um valor de erro indicando falha
  • Retornar, ignorando completamente o problema
  • Chamar uma função para tratar o erro

4 Na ausência de exceções

Terminar o programa com código de erro

  • Mensagem de erro pode não ser clara
  • E se o programa for uma aplicação crítica?

\pause Retornar um valor de erro indicando falha (comum em C)

  • Nem sempre existe um valor não válido
  • Valor de retorno deve ser sempre verificado
    → Eficiência, Disciplina, Legibilidade
    #define FIM_DE_ARQUIVO 1
    #define CARACTERE INESPERADO 2
        

\pause Retornar, ignorando completamento o problema
Ou “inventando” um retorno válido

  • Altamente não confiável

\pause Chamar uma função de tratamento de erros

  • Quem chama?
  • Qual função?

5 Tratamento adequado de exceções

O que o usuário faria nos casos abaixo?

./excecao1.jpg

./excecao2.jpg

./excecao3.jpg

6 Tratamento adequado de exceções

./excecao4.jpg

7 Premissas

Possíveis problemas podem ser antecipados

Situações de erro podem ser revertidas

Solução ideal

  • Tratamento de problemas separado do código normal

Mecanismo

Sistema de Tratamento de Exceções (STE)

8 Histórico

Primeira linguagem com suporte a exceções: PL/I (1964)

Construção executável para registrar um tratador

ON condition
   statement

Funcionamento

Experiência com essa técnica

  • Confuso
  • Sensível a erros de programação

9 Em linguagens mais recentes

Clu, Ada, Modula-3, Python, PHP, Ruby, C++, Java, C#, ML

Tratadores são vinculados lexicalmente a blocos de código

Exemplo em C++

try {
  ...
  if (algo_inesperado)
     throw minha_excecao();
  ...
  cout << "tudo vai bem" << endl;
  ...
} catch (minha_excecao) {
   cout << "oops" << endl;
}

10 Em linguagens mais recentes

Subprogramas não precisam tratar todas as exceções

void foo() {
  ...
  if (algo_inesperado)
     throw minha_excecao();
  ...
}

Tratador pode estar na função chamadora

try{
   ...
   foo();
   ...
   cout << "tudo vai bem" << endl;
   ...
}catch (minha_excecao) {
   cout << "oops" << endl;
}