Foutafhandeling in de taal C is altijd een taak van de ontwikkelaar geweest. In de standaardbibliotheek zijn er geen uitzonderingen; fouten worden geretourneerd via retourcodes of een globale variabele errno (begin van gebruik - UNIX jaren 70, daarna POSIX en ANSI C). Dergelijke mechanismen worden ook vandaag de dag gebruikt voor het beheren van de uitvoeringsstroom in onvoorziene situaties.
Fouten bij het werken met standaardfuncties (bestandshandelingen, geheugenallocatie, stringfuncties) kunnen onopgemerkt blijven zonder speciale controle. Onjuiste afhandeling - negeren van de retourcode, verkeerde interpretatie van errno, gebrek aan opruimen van middelen - leidt tot onjuiste werking van de software, crashes en kwetsbaarheden.
Juiste foutafhandeling vereist verplichte analyse van de waarden die door functies worden geretourneerd, gebruik van errno alleen onmiddellijk na een mislukking, en informatieve foutmeldingen. Retourcodes hebben de voorkeur voor interne functies - ze maken afhandeling mogelijk zonder globale bijeffecten. errno wordt vaker gebruikt met systeemaanroepen en functies van de standaardbibliotheek. Na elke potentieel gevaarlijke operatie wordt de retourwaarde geanalyseerd, en de globale status (errno) mag niet worden overschreven door tussenliggende aanroepen.
Voorbeeldcode:
#include <stdio.h> #include <errno.h> #include <string.h> FILE *open_file(const char *filename) { errno = 0; FILE *f = fopen(filename, "r"); if (!f) { fprintf(stderr, "Fout: %s ", strerror(errno)); } return f; }
Kernpunten:
Mag errno worden gebruikt voor gebruikersfuncties als men fouten naar boven wil doorgeven?
Nee, errno is alleen bedoeld voor standaardbibliotheek en systeemaanroepen. Het is globaal, kan op elk moment worden overschreven en is niet geschikt voor eigen functies.
Is het noodzakelijk om errno in te stellen voor elke functieaanroep?
Nee, maar het wordt aanbevolen om errno te resetten (bijvoorbeeld naar nul) voor aanroepen als een analyse van wijzigingen wordt gepland. Niet elke functie verandert errno bij succes, alleen bij een fout.
errno = 0; ... aanroep van een gevaarlijke functie ...
Kan men errno vertrouwen na elke functie?
Alleen voor die functies die volgens de standaard deze expliciet instellen bij mislukking. Veel functies van de standaardbibliotheek raken errno niet bij succes. Documentatie is je vriend.
Een bestand openen zonder het resultaat te controleren; fouten worden niet geanalyseerd; het programma werkt onjuist bij een ontbrekend bestand:
Voordelen:
Nadelen:
Na elke kritische functie wordt het resultaat gecontroleerd; in geval van een fout wordt een gedetailleerd bericht weergegeven met strerror(errno), en de uitvoering eindigt correct:
Voordelen:
Nadelen: