90 likes | 188 Views
Aula 14. Tratamento de erros O rigens dos erros Instruções usuais Papeis do humano Protecção contra : erros lógicos erros do utilizador erros com origem em recursos externos. Origens dos erros. Utilizador humano do programa
E N D
Aula 14 • Tratamento de erros • Origens dos erros • Instruções usuais • Papeis do humano • Protecção contra: • erros lógicos • erros do utilizador • erros com origem em recursos externos Programação Orientada para Objectos
Origens dos erros • Utilizador humano do programa • Erros do programador (quer como programador consumidor quer como programador produtor) • Recursos externos inadequados (errados, indisponíveis ou insuficientes) Programação Orientada para Objectos
Princípios • O utilizador errará • O utilizador falhará na pior ocasião (a única não prevista) • O programador errará • Alguns os erros do programador resistirão a todos os testes e revelar-se-ão apenas depois de o programa ter sido distribuido ao seu utilizador final Programação Orientada para Objectos
Papeis do humano • Erros têm, muitas vezes, origem humana • Utilizador do programa é tipicamente humano • Programador, quer como programador consumidor quer como programador produtor, é também humano Programação Orientada para Objectos
Ferramentas • Instruções de selecção • Instruções condicionais • Instruções de iteração • Asserções • Excepções Programação Orientada para Objectos
#include <iostream> #include <limits> using namespace std; /** Devolve uma aproximação da raiz quadradade valor. @pre 0 <= valor. @post |raizDe × raizDe - valor| <= e × v, onde e (epsilon) é a diferença entre o menor double maior que 1 e 1, representando portanto de alguma forma o limite mínimo de erro alcançável.e = numeric_limits<double>::epsilon(). */ double raizDe(double const valor) { double raiz_anterior = 0.0; double raiz = valor; while(raiz != raiz_anterior) { raiz_anterior = raiz; raiz = 0.5 * (raiz_anterior + valor / raiz_anterior); } return raiz; } int main() { cout << "Introduza um valor: "; double valor_lido; cin >> valor_lido; cout << "raiz de " << valor_lido << " é “ << raizDe(valor_lido) << endl; } Cálculo da raiz quadrada Programação Orientada para Objectos
#include <iostream> #include <limits> #include <cassert> #include <cstdlib> using namespace std; /** Devolve uma aproximação da raiz quadradade valor. @pre 0 <= valor. @post |raizDe × raizDe-valor| <= e × v,onde e (epsilon) é a diferença entre omenor double maior que 1 e 1, representando portanto de alguma forma o limite mínimo deerro alcançável. e = numeric_limits<double>::epsilon(). */ double raizDe(double const valor) { assert(0.0 <= valor); double raiz_anterior = 0.0; double raiz = valor; while(raiz != raiz_anterior) { raiz_anterior = raiz; raiz = 0.5 * (raiz_anterior + valor / raiz_anterior); } assert(abs(raiz * raiz - valor) <= numeric_limits<double>::epsilon() * valor); return raiz; } int main() { cout << "Introduza um valor: "; double valor_lido; cin >> valor_lido; cout << "raiz de " << valor_lido << " é “ << raizDe(valor_lido) << endl; } Protecção contra erros do programador Programação Orientada para Objectos
... void ignoraLinha(){ cin.clear(); char caractere; do cin.get(caractere); while(not cin.fail() and caractere != '\n'); } void lêValorNãoNegativoPara(double& valor_lido){ while(true) { cout << "Introduza um valor: "; cin >> valor_lido; if(not cin.fail() and 0.0 <= valor_lido) return; if(cin.fail()) { ignoraLinha(); cout << "Tem de ser real!“ << endl; } else // valor_lido < 0.0 cout << “Não pode ser negativo!“ << endl; } } int main() { double valor_lido; lêValorNãoNegativoPara(valor_lido); cout << "raiz de " << valor_lido << " é " << raizDe(valor_lido) << endl; } Protecção contra erros do utilizador Programação Orientada para Objectos
Protecção contra erroscom origem em recursos externos • Filosofia: recursos disponíveis e sem problemas, excepto casos excepcionais • Utilização de excepçoes • Erros são detectados e são lançadas excepções • Só captura a excepção quem sabe lidar com o erro Programação Orientada para Objectos