100 likes | 230 Views
C Tutorium – Fehlerbehandlung –. Knut Stolze. Grundsatz. Jeder(!) Funktionsaufruf kann Fehler produzieren. Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!!. (Ausnahmen bestätigen die Regel!). Fehler von Systemfunktionen.
E N D
C Tutorium – Fehlerbehandlung – Knut Stolze
Grundsatz Jeder(!) Funktionsaufruf kann Fehler produzieren • Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! (Ausnahmen bestätigen die Regel!)
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
errno • Header <errno.h> muss eingebunden werden. • Errno ist keine (globale) Variable • Wäre nicht re-entrant • Abhängig von Plattform • Auf Linux/Cygwin als Makro implementiert
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
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);
Typische Fehlerbehandlungin DB2 UDB sqlzRc myFunction(…) { sqlzRc rc = SQL_OK; char *buffer = NULL; … buffer = (char *)malloc(length); if (!buffer) { rc = SQLZ_OUT_OF_MEMORY; goto cleanup; }
Typische Fehlerbehandlungin DB2 UDB (2) rc = sqluimpr(…); if (rc != SQL_OK) { goto cleanup; } … cleanup: if (buffer != NULL) { free(buffer); } }
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
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 <limits.h> festgelegt • Numerische Genauigkeit von Fliesskommazahlen