c tutorium – fehlerbehandlung –
DESCRIPTION
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. - PowerPoint PPT PresentationTRANSCRIPT
C TutoriumC Tutorium – Fehlerbehandlung – – Fehlerbehandlung –
Knut Stolze
2
GrundsatzGrundsatz
Also ist auch nach jedem Funktionsaufrufauf Fehler zu prüfen!!
Jeder(!) Funktionsaufruf kann Fehler produzieren
(Ausnahmen bestätigen die Regel!)
3
Fehler von SystemfunktionenFehler 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
errnoerrno
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
5
errno (2)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
Vorsicht bei geschachtelte Funktionenstrcpy(malloc(strlen(my_str)+1, my_str);– “malloc” kann fehl schlagen– “strcpy” arbeitet in diesem Fall mit NULL-ZeigerLieber einzelne Schritte explizit programmieren
ptr = (char *)malloc(strlen(my_str)+1);
if (!ptr) { … /* Fehlerbehandlung */ }
strcpy(ptr, my_str);
7
Typische FehlerbehandlungTypische Fehlerbehandlungin DB2 UDBin 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
Typische FehlerbehandlungTypische Fehlerbehandlungin DB2 UDB (2)in DB2 UDB (2)
rc = sqluimpr(…);if (rc != SQL_OK) {
goto cleanup;}…
cleanup:if (buffer != NULL) {
free(buffer);}
}
9
FehlerbehandlungFehlerbehandlung
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
Numerische BesonderheitenNumerische 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