Gestion avancée des erreurs
Gestion des erreurs basée sur les exceptions
Gestion personnalisée des exceptions de flux
#include <iostream>
#include <stdexcept>
#include <sstream>
class StreamException : public std::runtime_error {
public:
StreamException(const std::string& message)
: std::runtime_error(message) {}
};
void processInputStream(std::istream& input) {
try {
input.exceptions(std::ios::failbit | std::ios::badbit);
int value;
input >> value;
if (value < 0) {
throw StreamException("Valeur négative non autorisée");
}
}
catch (const std::ios_base::failure& e) {
throw StreamException("Erreur de flux d'entrée");
}
}
Flux de travail de la stratégie de gestion des erreurs
graph TD
A[Entrée reçue] --> B{Valider l'entrée}
B -->|Valide| C[Traiter les données]
B -->|Invalide| D[Lever une exception personnalisée]
D --> E[Enregistrer l'erreur]
E --> F[Récupérer/Réessayer]
Techniques avancées de gestion des erreurs
Technique |
Description |
Implémentation |
Gestion des exceptions |
Lever des exceptions personnalisées |
Blocs try-catch |
Journalisation des erreurs |
Enregistrer des informations détaillées sur les erreurs |
Frameworks de journalisation |
Dégradation contrôlée |
Fournir des mécanismes de secours |
Traitement alternatif |
Gestion complète des erreurs
Gestion des erreurs à plusieurs niveaux
#include <iostream>
#include <fstream>
#include <stdexcept>
#include <memory>
class InputHandler {
public:
enum class ErrorSeverity {
Faible,
Moyen,
Elevé
};
class InputError : public std::runtime_error {
private:
ErrorSeverity gravité;
public:
InputError(const std::string& message, ErrorSeverity sev)
: std::runtime_error(message), gravité(sev) {}
ErrorSeverity getSeverity() const { return gravité; }
};
static void processInput(std::istream& input) {
try {
int value;
if (!(input >> value)) {
throw InputError("Format d'entrée invalide",
ErrorSeverity::Moyen);
}
if (value < 0) {
throw InputError("Valeur négative",
ErrorSeverity::Elevé);
}
}
catch (const InputError& e) {
handleError(e);
}
}
private:
static void handleError(const InputError& error) {
switch (error.getSeverity()) {
case ErrorSeverity::Faible:
std::cerr << "Avertissement : " << error.what() << std::endl;
break;
case ErrorSeverity::Moyen:
std::cerr << "Erreur : " << error.what() << std::endl;
break;
case ErrorSeverity::Elevé:
std::cerr << "Critique : " << error.what() << std::endl;
throw; // Relever l'exception pour un traitement de niveau supérieur
}
}
};
Modèles de gestion des erreurs
stateDiagram-v2
[*] --> Normal : État initial
Normal --> Erreur : Échec de la validation de l'entrée
Erreur --> Journalisation : Enregistrer l'erreur
Journalisation --> Récupération : Tentative de récupération
Récupération --> Normal : Réessayer l'entrée
Récupération --> [*] : Terminer le processus
Bonnes pratiques
- Utiliser des exceptions fortement typées
- Implémenter une gestion hiérarchique des erreurs
- Fournir un contexte d'erreur détaillé
- Permettre des mécanismes de récupération d'erreur flexibles
- Minimiser la surcharge des exceptions
- Utiliser des mécanismes de gestion d'erreur légers
- Implémenter une journalisation d'erreur efficace
Aperçu LabEx
Explorez les techniques avancées de gestion des erreurs dans l'environnement de programmation C++ LabEx pour développer des stratégies robustes de traitement des entrées.
Catégorisation des erreurs
enum class StreamErrorType {
ERREUR_FORMAT,
ERREUR_INTERVALLE,
ERREUR_RESSOURCE,
ERREUR_AUTORISATION
};
struct ErrorContext {
StreamErrorType type;
std::string description;
int errorCode;
std::chrono::system_clock::time_point timestamp;
};