C:
Kirjoittaminen standardivirheeseen
Kuinka tehdä:
C:ssä stderr
-virtaa käytetään virheilmoitusten kirjoittamiseen. Toisin kuin standarditulosteeseen kirjoittaminen printf
-funktiolla, virheviestien kirjoittaminen stderr
-virtaan voidaan tehdä käyttäen fprintf
- tai fputs
-funktioita. Tässä on miten voit tehdä sen:
#include <stdio.h>
int main() {
fprintf(stderr, "Tämä on virheilmoitus.\n");
fputs("Tämä on toinen virheilmoitus.\n", stderr);
return 0;
}
Näytekirjoitus (stderriin):
Tämä on virheilmoitus.
Tämä on toinen virheilmoitus.
On tärkeää huomata, että vaikka tuloste näyttää samanlaiselta kuin stdout
konsolissa, kun ohjelmaa käytetään terminaalissa uudelleenohjauksen avulla, ero tulee selkeäksi:
$ ./your_program > output.txt
Tämä komento ohjaa vain tavallisen tulosteen output.txt
-tiedostoon, kun taas virheilmoitukset näkyvät edelleen ruudulla.
Syväsukellus
Ero stdout
- ja stderr
-virtausten välillä Unix-pohjaisissa järjestelmissä juontaa juurensa C:n ja Unixin alkuaikoihin. Tämä erottelu mahdollistaa vankemman virheenkäsittelyn ja lokitusten, koska se antaa ohjelmoijille mahdollisuuden ohjata virheilmoitukset erillään tavallisesta ohjelman tulosteesta. Vaikka stderr
on oletusarvoisesti puskuroimaton varmistaen virheilmoitusten välittömän tulostuksen, mikä auttaa vianmäärityksessä kaatuessa ja muissa kriittisissä ongelmissa, stdout
on tyypillisesti puskuroitu, mikä tarkoittaa, että sen tulostus saattaa viivästyä kunnes puskuri huuhdellaan (esim. ohjelman suorituksen päätyttyä tai manuaalisesti).
Nykysovelluksissa stderr
-virtaan kirjoittaminen on edelleen relevanttia, erityisesti komentorivityökaluissa ja palvelinsovelluksissa, joissa tavallisten lokiviestien ja virheiden erottaminen on olennaista. Kuitenkin monimutkaisemmissa virheenkäsittelytilanteissa, erityisesti GUI-sovelluksissa tai kun tarvitaan hienostuneempia lokitusmekanismeja, ohjelmoijat saattavat käyttää dedikoituja lokituskirjastoja, jotka tarjoavat enemmän kontrollia viestien muotoiluun, kohdistamiseen (esim. tiedostot, verkko) ja tärkeysasteisiin (info, varoitus, virhe jne.).
Vaikka stderr
tarjoaa perusmekanismin virheraportointiin C:ssä, ohjelmointikäytäntöjen kehittyminen ja edistyneiden lokituskehysten saatavuus tarkoittavat usein, että se on vain lähtökohta nykyaikaisille virheenkäsittelystrategioille.