C Tutorium – Fehlerbehandlung –

Preview:

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 Presentation

Citation preview

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

Recommended