10
C Tutorium C Tutorium – Fehlerbehandlung – – Fehlerbehandlung – Knut Stolze

C Tutorium – Fehlerbehandlung –

  • Upload
    niabi

  • View
    40

  • Download
    0

Embed Size (px)

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

Page 1: C Tutorium  – Fehlerbehandlung –

C TutoriumC Tutorium – Fehlerbehandlung – – Fehlerbehandlung –

Knut Stolze

Page 2: C Tutorium  – Fehlerbehandlung –

2

GrundsatzGrundsatz

Also ist auch nach jedem Funktionsaufrufauf Fehler zu prüfen!!

Jeder(!) Funktionsaufruf kann Fehler produzieren

(Ausnahmen bestätigen die Regel!)

Page 3: C Tutorium  – Fehlerbehandlung –

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

Page 4: C Tutorium  – Fehlerbehandlung –

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

Page 5: C Tutorium  – Fehlerbehandlung –

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

Page 6: C Tutorium  – Fehlerbehandlung –

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);

Page 7: C Tutorium  – Fehlerbehandlung –

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;

}

Page 8: C Tutorium  – Fehlerbehandlung –

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);}

}

Page 9: C Tutorium  – Fehlerbehandlung –

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

Page 10: C Tutorium  – Fehlerbehandlung –

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