Forum: PC-Programmierung Error Handling unter C++


von Christian (Gast)


Lesenswert?

Hallo,

Mich würden gängige Wege zur Fehlerbehandlung interessieren.

Beispiel: Ich hätte die Klasse interface welche mit der seriellen 
Schnittstelle kommuniziert. Für das senden von Informationen gäbe es die 
Funktion send welche die C-funktion für das senden aufruft. Die 
c-funktion gibt die anzahl der gesendeten bytes zurück.

Wenn jetzt aber nicht alle bytes gesendet wurden ist dies eigentlich ein 
Fehler.

Beispiel:
(eventuelle Programmierfehler einfach ignorieren, geht nur ums prinzip)
1
class interface
2
{
3
....
4
5
   void send(xyz variable)
6
   {
7
      bytelaenge=sizeof(variable);
8
      gesendetebytes=::send(variable, bytelaenge);
9
      if(gesendetebytes != bytelaenge)
10
      {
11
         ////ERROR
12
      }
13
   }
14
15
....
16
}

Gibt es da einen gängigen Weg für die Fehlerbehandlung?

Ich habe z.B. schon die Funktionen good() und bad() gesehen, welche 
angeben ob die letzte Klassenfunktion ohne Fehler ausgeführt wurde.

Dann gäbe es ja noch die try und catch Methode, welche eventuell aber 
hier stört da mancher Entwickler es einfach nur senden will.

Was würdet ihr empfehlen?

von Peter II (Gast)


Lesenswert?

wenn man schon c++ programmiert dann macht man die fehlerbehandlung auch 
sinnvollerweise mit exceptions, wenn der fehler in einigen fällen nicht 
benötigt wird, kann man der send methode noch ein parameter mitgeben 
IgnoreError.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn in diesem Falle exceptions nicht genutzt werden sollen, dann 
erfolgt das Fehlerhandling durch den Rückgabewert der Funktion, ganz 
so, wie es in klassischem C auch üblich ist.

So etwas wie send sollte daher nicht als void deklariert werden.

von Εrnst B. (ernst)


Lesenswert?

Rufus Τ. Firefly schrieb:
> So etwas wie send sollte daher nicht als void deklariert werden.

Und wenn man ganz auf Nummer Sicher gehen will, und die GCC benutzt, 
kann man der Funktion noch ein attribute(warn_unused_result) verpassen.

Dann kriegt man eine Compiler-Warning, wenn der Aufrufer sich nicht um 
den Rückgabewert deiner "send"-Methode schert.

von Jasch (Gast)


Lesenswert?

Christian schrieb:
> Hallo,
>
> Mich würden gängige Wege zur Fehlerbehandlung interessieren.
>
> Beispiel: Ich hätte die Klasse interface welche mit der seriellen
> Schnittstelle kommuniziert. Für das senden von Informationen gäbe es die
> Funktion send welche die C-funktion für das senden aufruft. Die
> c-funktion gibt die anzahl der gesendeten bytes zurück.
>
> Wenn jetzt aber nicht alle bytes gesendet wurden ist dies eigentlich ein
> Fehler.

Hmm, aber dann sollte die Funktion nicht zurückgeben wieviele Bytes 
versendet wurden sondern ob alle versendet wurden?

[Cut]
> Gibt es da einen gängigen Weg für die Fehlerbehandlung?
>
> Ich habe z.B. schon die Funktionen good() und bad() gesehen, welche
> angeben ob die letzte Klassenfunktion ohne Fehler ausgeführt wurde.
>
> Dann gäbe es ja noch die try und catch Methode, welche eventuell aber
> hier stört da mancher Entwickler es einfach nur senden will.

Und falls Du genau gemeint hast was der letzte Satz sagt - kommt in 
send() eine Schleife rein, mit einer begrenzten Anzahl Wiederholungen, 
die versucht die "übriggebliebenen" Bytes zu versenden (übrigens dito 
beim Lesen einer vorher bekannten Anzahl Bytes). Erst wenn nach allen 
Versuchen noch Bytes übrigbleiben, gibt es einen Fehler.

Aber Vorsicht! Es bringt i.A. wenig, alle Retries innerhalb weniger µs 
zu machen - so schnell wird Deine serielle Schnittstelle ihre Puffer 
nicht leeren können. Ist komplizierter als man erstmal denkt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.