Estratégias de Recuperação de Erros
Compreendendo a Recuperação de Erros
A recuperação de erros é um aspecto crucial da programação robusta em C++, permitindo que as aplicações lidem com entradas inesperadas e mantenham a estabilidade.
Fluxo de Trabalho de Recuperação
graph TD
A[Erro de Entrada Detetado] --> B{Tipo de Erro}
B --> |Recuperável| C[Limpar Estado do Fluxo]
B --> |Crítico| D[Terminar/Registar Erro]
C --> E[Reiniciar o Buffer de Entrada]
E --> F[Solicitar Nova Entrada]
Técnicas de Recuperação Principais
1. Reinicialização do Estado do Fluxo
void resetInputStream() {
std::cin.clear(); // Limpar flags de erro
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
2. Tratamento Abrangente de Erros
#include <iostream>
#include <limits>
#include <stdexcept>
class InputException : public std::runtime_error {
public:
InputException(const std::string& message)
: std::runtime_error(message) {}
};
int safeIntegerInput() {
int value;
while (true) {
std::cout << "Digite um inteiro: ";
if (std::cin >> value) {
return value;
}
if (std::cin.eof()) {
throw InputException("Fim da entrada alcançado");
}
if (std::cin.fail()) {
std::cerr << "Entrada inválida. Tente novamente.\n";
resetInputStream();
}
}
}
int main() {
try {
int result = safeIntegerInput();
std::cout << "Entrada válida: " << result << std::endl;
}
catch (const InputException& e) {
std::cerr << "Erro fatal: " << e.what() << std::endl;
return 1;
}
return 0;
}
Estratégias de Recuperação de Erros
| Estratégia |
Descrição |
Caso de Uso |
| Reinicialização do Fluxo |
Limpar flags de erro e buffer |
Erros de entrada recuperáveis |
| Tratamento de Exceções |
Lançar e capturar erros específicos |
Falhas críticas de entrada |
| Mecanismo de Repetição |
Tentar a entrada várias vezes |
Problemas temporários de entrada |
| Valores de Reenvio |
Fornecer valores padrão |
Cenários não críticos |
Padrões de Recuperação Avançados
1. Recuperação com Múltiplas Tentativas
int inputWithRetry(int maxAttempts = 3) {
for (int attempt = 0; attempt < maxAttempts; ++attempt) {
try {
return safeIntegerInput();
}
catch (const InputException& e) {
std::cerr << "Tentativa " << (attempt + 1)
<< " falhou: " << e.what() << std::endl;
}
}
throw InputException("Número máximo de tentativas excedido");
}
2. Registros e Monitorização
#include <fstream>
void logInputError(const std::string& errorMessage) {
std::ofstream errorLog("input_errors.log", std::ios::app);
errorLog << "[" << std::time(nullptr) << "] "
<< errorMessage << std::endl;
}
Boas Práticas
- Implementar várias camadas de recuperação
- Usar exceções para erros críticos
- Fornecer feedback claro ao utilizador
- Registar detalhes de erros para depuração
- Desenhar mecanismos de entrada à prova de falhas
A LabEx recomenda o desenvolvimento de estratégias abrangentes de recuperação de erros para criar aplicações C++ resilientes que lidem graciosamente com cenários de entrada inesperados.