Erweiterte Fehlerbehandlung
Ausnahmebasierte Fehlerverwaltung
Benutzerdefinierte Stream-Ausnahmebehandlung
#include <iostream>
#include <stdexcept>
#include <sstream>
class StreamException : public std::runtime_error {
public:
StateException(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("Negative Wert nicht erlaubt");
}
}
catch (const std::ios_base::failure& e) {
throw StreamException("Eingabe-Stream-Fehler");
}
}
Ablauf der Fehlerbehandlungsstrategie
graph TD
A[Eingabe empfangen] --> B{Eingabe validieren}
B -->|Gültig| C[Daten verarbeiten]
B -->|Ungültig| D[Benutzerdefinierte Ausnahme werfen]
D --> E[Fehler protokollieren]
E --> F[Wiederherstellen/erneut versuchen]
Erweiterte Fehlerbehandlungstechniken
Technik |
Beschreibung |
Implementierung |
Ausnahmebehandlung |
Benutzerdefinierte Ausnahmen werfen |
Try-catch-Blöcke |
Fehlerprotokollierung |
Detaillierte Fehlerinformationen aufzeichnen |
Logging-Frameworks |
Fehlertoleranz |
Ausweichmechanismen bereitstellen |
Alternative Verarbeitung |
Umfassende Fehlerverwaltung
Fehlerbehandlung auf mehreren Ebenen
#include <iostream>
#include <fstream>
#include <stdexcept>
#include <memory>
class InputHandler {
public:
enum class ErrorSeverity {
Low,
Medium,
High
};
class InputError : public std::runtime_error {
private:
ErrorSeverity severity;
public:
InputError(const std::string& message, ErrorSeverity sev)
: std::runtime_error(message), severity(sev) {}
ErrorSeverity getSeverity() const { return severity; }
};
static void processInput(std::istream& input) {
try {
int value;
if (!(input >> value)) {
throw InputError("Ungültiges Eingabeformat",
ErrorSeverity::Medium);
}
if (value < 0) {
throw InputError("Negativer Wert",
ErrorSeverity::High);
}
}
catch (const InputError& e) {
handleError(e);
}
}
private:
static void handleError(const InputError& error) {
switch (error.getSeverity()) {
case ErrorSeverity::Low:
std::cerr << "Warnung: " << error.what() << std::endl;
break;
case ErrorSeverity::Medium:
std::cerr << "Fehler: " << error.what() << std::endl;
break;
case ErrorSeverity::High:
std::cerr << "Kritisch: " << error.what() << std::endl;
throw; // Wiederaufwerfen für die Behandlung auf höherer Ebene
}
}
};
Fehlerbehandlungsmuster
stateDiagram-v2
[*] --> Normal : Initialer Zustand
Normal --> Fehler : Eingabevalidierung fehlgeschlagen
Fehler --> Protokollierung : Fehler protokollieren
Protokollierung --> Wiederherstellung : Wiederherstellungsversuch
Wiederherstellung --> Normal : Eingabe erneut versuchen
Wiederherstellung --> [*] : Prozess beenden
Best Practices
- Verwenden Sie stark typisierte Ausnahmen
- Implementieren Sie eine hierarchische Fehlerbehandlung
- Stellen Sie detaillierte Fehlerkontexte bereit
- Ermöglichen Sie flexible Fehlerwiederherstellungsmechanismen
- Minimieren Sie den Overhead von Ausnahmen
- Verwenden Sie leichte Fehlerbehandlungsmechanismen
- Implementieren Sie eine effiziente Fehlerprotokollierung
LabEx-Einblick
Erkunden Sie erweiterte Fehlerbehandlungstechniken in der LabEx C++-Programmierumgebung, um robuste Strategien für die Eingabeverarbeitung zu entwickeln.
Fehlerkategorisierung
enum class StreamErrorType {
FORMAT_ERROR,
RANGE_ERROR,
RESOURCE_ERROR,
PERMISSION_ERROR
};
struct ErrorContext {
StreamErrorType type;
std::string description;
int errorCode;
std::chrono::system_clock::time_point timestamp;
};