Seite 1 von 1

Fehlerbehandung mit Signalen

Verfasst: 9. November 2010 21:11
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!

Re: Fehlerbehandung mit Signalen

Verfasst: 21. Dezember 2010 21:11
von koppi
Gute Idee mit Enum und Signalen, es gibt auch ganze Fehler-Klassen in Projekten wie gcc oder firefox.

Verfasst: 21. Dezember 2010 22:37
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.