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
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)
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
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?
O que o usuário faria nos casos abaixo?
(Nota: imagem editada manualmente.)
http://www.junauza.com/2010/05/worlds-funniest-windows-error-messages.html
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)
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
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;
}
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;
}