Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann.

Ähnliche Präsentationen


Präsentation zum Thema: "C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann."—  Präsentation transkript:

1 C Tutorium – Fehlerbehandlung – Knut Stolze

2 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann Fehler produzieren (Ausnahmen bestätigen die Regel!)

3 3 Fehler von Systemfunktionen Alle Systemfunktionen geben Fehlerinformationen zurück – strchr – NULL Zeiger – fopen – NULL Zeiger – strtol – 0 – shmget – -1 Zusätzliche Fehler werden über errno (vom Typ int) an Anwendung übermittelt

4 4 errno Header muss eingebunden werden. Errno ist keine (globale) Variable – Wäre nicht re-entrant – Abhängig von Plattform Auf Linux/Cygwin als Makro implementiert

5 5 errno (2) Definitionen der Fehlercodes in /usr/include/errno.h, z.B.: #define EPERM 1 /* Not super-user */ #define ENOENT 2 /* No such file or dir */ #define ESRCH 3 /* No such process */ #define EINTR 4 /* Interrupted system call */ #define EIO 5 /* I/O error */ Fehlercodes können system-abhängig sein – Immer Macros EPERM etc. verwenden

6 6 Vorsicht bei geschachtelte Funktionen strcpy(malloc(strlen(my_str)+1, my_str); – malloc kann fehl schlagen – strcpy arbeitet in diesem Fall mit NULL-Zeiger Lieber einzelne Schritte explizit programmieren ptr = (char *)malloc(strlen(my_str)+1); if (!ptr) { … /* Fehlerbehandlung */ } strcpy(ptr, my_str);

7 7 Typische Fehlerbehandlung in DB2 UDB sqlzRc myFunction(…) { sqlzRc rc = SQL_OK; char *buffer = NULL; … buffer = (char *)malloc(length); if (!buffer) { rc = SQLZ_OUT_OF_MEMORY; goto cleanup; }

8 8 Typische Fehlerbehandlung in DB2 UDB (2) rc = sqluimpr(…); if (rc != SQL_OK) { goto cleanup; } … cleanup: if (buffer != NULL) { free(buffer); }

9 9 Fehlerbehandlung Im Fehlerfall muss jede Funktion einen wohl- definierten Zustand zurücklassen, z.B. – Allokierten Speicher wieder freigeben – Geänderte Signal-Händler zurücksetzen – Fehlermeldungen setzen Nie, nie und nie exit oder abort verwenden!!! – Funktion kann innerhalb Bibliothek von anderen Programmen verwendet werden – exit/abort würde Programm beenden – Fehler einfach zum Aufrufer immer durchreichen

10 10 Numerische Besonderheiten Keine Laufzeitüberprüfungen bei numerischen Operationen – Überläufe und Unterläufe möglich; werden nicht erkannt müssen von Anwendung abgefangen werden Integer-Zahlen – signed/unsigned char/short/int/long/long long – Grenzen (min/max) in festgelegt Numerische Genauigkeit von Fliesskommazahlen


Herunterladen ppt "C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann."

Ähnliche Präsentationen


Google-Anzeigen