C:
Virheiden käsittely

Miten:

C ei sisällä sisäänrakennettua tukea poikkeuksille kuten jotkut muut kielet. Sen sijaan se nojaa muutamiin perinteisiin virheidenkäsittelystrategioihin, kuten erityisten arvojen palauttamiseen funktioista ja globaalien muuttujien, kuten errno, asettamiseen.

Erityisten Arvojen Palauttaminen

Funktiot voivat ilmoittaa virheistä palauttamalla tietyn arvon, joka on epätodennäköisesti kelvollinen tulos. Tässä on esimerkki kokonaisluvuilla:

#include <stdio.h>

int inverse(int number, double *result) {
    if (number == 0) {
        return -1; // Virhetilanne
    } else {
        *result = 1.0 / number;
        return 0; // Onnistui
    }
}

int main() {
    double result;
    if (inverse(0, &result) < 0) {
        printf("Virhe: Jakaminen nollalla.\n");
    } else {
        printf("Käänteisarvo on: %f\n", result);
    }
    
    return 0;
}

Tuloste:

Virhe: Jakaminen nollalla.

errno Tarkistaminen

Kirjastofunktioissa, erityisesti niissä jotka vuorovaikuttavat järjestelmän tai käyttöjärjestelmän kanssa (kuten tiedostojen I/O), asetetaan errno, kun virhe tapahtuu. Käyttääksesi sitä, sisällytä errno.h ja tarkista errno epäillyn epäonnistumisen jälkeen:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        printf("Virhe tiedoston avaamisessa: %s\n", strerror(errno));
    }
    
    return 0;
}

Tuloste:

Virhe tiedoston avaamisessa: Tiedostoa tai hakemistoa ei ole

Syväluotaus

Historiallisesti C-ohjelmointikielen minimalistinen suunnittelu on jättänyt pois sisäänrakennetun poikkeusten käsittelymekanismin, mikä heijastaa sen matalan tason, järjestelmäohjelmoinnin alkuperää, jossa maksimaalinen suorituskyky ja suora hallinta ovat kriittisiä. Sen sijaan C omaksuu manuaalisemman virheidenkäsittelylähestymistavan, joka sopii sen filosofiaan antaa ohjelmoijille mahdollisimman paljon kontrollia, jopa mukavuuden kustannuksella.

Vaikka tämä lähestymistapa on linjassa C:n suunnittelutavoitteiden kanssa, se voi johtaa myös sanalliseen virhetarkistuskoodiin ja mahdollisiin tarkistamatta jääviin virheisiin, jotka modernit kielet käsittelevät rakenteellisen poikkeustenkäsittelyn mekanismeilla. Esimerkiksi poikkeukset kielissä kuten Java tai C# mahdollistavat keskitetyn virheenkäsittelyn, mikä tekee koodista siistimpää ja virheenhallinnasta suoraviivaisempaa. Kuitenkin poikkeukset tuovat mukanaan oman ylikuormansa ja monimutkaisuutensa, joka ei välttämättä ole ihanteellista järjestelmätason ohjelmoinnissa, jossa C loistaa.

Huolimatta sen karkeudesta, tämä manuaalinen virheidenkäsittely C:ssä on vaikuttanut monien muiden kielten virheenhallinnan suunnitteluun, tarjoten mallin, jossa virhetilojen selkeys voi johtaa ennustettavampaan ja helpommin vianetsittävään koodiin. Kriittisissä järjestelmissä, joissa vikatilanteet on hallittava sulavasti, C:n virheenkäsittelyparadigma – yhdistettynä modernien parhaiden käytäntöjen, kuten virheidenkäsittelykirjastojen ja -konventioiden, kanssa – varmistaa järjestelmän luotettavuuden ja robustiuden.