Fehlerbehandung mit Signalen

Alles rund um die Programmierung mit Qt
Antworten
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Fehlerbehandung mit Signalen

Beitrag von DBGTMaster »

Hallo,

mich würde mal interessieren, wie ihr das genau mit Klassen & Fehlerbehandlung macht?

Ein Beispiel:

Ich habe eine Klasse SysData, diese Klasse holt sich via einem QHttp Objekt Daten aus dem Internet, verarbeitet diese, und stellt bestimmte Daten dann den User über Methoden bereit.

In dieser Klasse könnten nun ein haufen von Fehlern auftreten:

1.) Die Usereingaben, welche der Klasse übergeben werden, könnten Fehler beinhalten.
2.) QHTTP Object: Die HTTP Anfrage könnte eine Menge Fehler erzeugen wie keine Internet- Verbindung, DNS Fehler,...
3.) Nach dem abholen der Daten via HTTP könnte beim verarbeiten der Daten ein Fehler auftreten
4.) und .. und .. und ..

Ich hab mir nun überlegt, ich lege ein enum mit allen möglichen Fehlern der Klasse an:

Code: Alles auswählen

enum errors {
  ERROR_USER_INPUT,        // Fehler bei der Usereingabe
  ERROR_HTTP_NO_CONNECTION,
  ERROR_HTTP_DNS_ERROR,
  ERROR_PARSE_HTTP_DATA,
  ....
  ....
}
Dann richte ich ein Signal ein:

Code: Alles auswählen

signals:
void error(Klassname::errors, QString errorMessage = "no error text");
Tritt nun ein Fehler in der Klasse aus, schmeiße ich folgendermaßen ein Signal:

Code: Alles auswählen

emit error(ERROR_USER_INPUT, tr("Es wurde ein ungültiger Name angegeben")
Wie löst ihr solche Dinge bei Klassen, welche eine Menge an Fehler werfen könnten??

Was haltet ihr von meiner Idee? Verbesserungsvorschläge?? Danke!
koppi
Beiträge: 29
Registriert: 21. Dezember 2010 14:30
Wohnort: Augsburg
Kontaktdaten:

Re: Fehlerbehandung mit Signalen

Beitrag von koppi »

Gute Idee mit Enum und Signalen, es gibt auch ganze Fehler-Klassen in Projekten wie gcc oder firefox.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Alle Fehler über SIGNAL/SLOT behandeln, finde ich ich nicht so doll. Für asynchrone Prozesse (wie HTTP) macht das sicher Sinn, für alles andere würde ich mir bessere Methoden überlegen, bei denen man auch direkt beim Aufruf reagieren kann. Auf Ein SIGNAL kann man ja nur im SLOT reagieren, und das ist außerhalb des werfenden Scopes...
C++ kennt exceptions. Wenn es Sinn macht (also der Fehler eine absolute Asunahme darstellt) kannst du direkt eine exception werfen. Usereingaben sollte man nicht mit einer Exception behandeln, wäre ja schlimm wenn der Browser sich beenden würde nur weil man die URL falsch geschrieben hat ^^ Hier würde ich mit return-Codes + lastError()-Methode in der "werfenden" Klasse arbeiten.

Und so ein Monster-ENUM wartet sich auch nicht von allein.
Antworten