1 / 10

C Tutorium – Fehlerbehandlung –

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.

niabi
Download Presentation

C Tutorium – Fehlerbehandlung –

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C Tutorium – Fehlerbehandlung – Knut Stolze

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

  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. 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

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

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

  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. 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

More Related