Errno
extern int errno;
<justify>Jak wiadomo, język ANSI C pozbawiony jest obsługi wyjątków. W związku z tym obsługa błędów polega jedynie na tym, że większość funkcji bibliotecznych zwraca specjalną wartość oznaczającą, że operacja się nie powiodła. Ta specjalna wartość może być równa -1, być pustym wskaźnikiem (NULL) lub stałą taką jak EOF zdefiniowaną specjalnie w tym celu. Jednak na podstawie tej wartości możemy się jedynie zorientować, że błąd nastąpił. Żeby dowiedzieć się, co konkretnie było skutkiem niepowodzenia, należy odczytać wartość specjalnej zmiennej globalnej errno, zadeklarowanej w pliku nagłówkowym errno.h. Początkowa wartość errno po uruchomieniu programu wynosi zero.</justify><justify> Głównym założeniem zmiennej jest to, że wiele funkcji bibliotecznych ustawia ją na pewną wartość niezerową po napotkaniu różnego rodzajów błędów. Błędy te są wyspecyfikowanie w opisie każdej z funkcji.</justify>
Funkcje nie zmieniają wartości errno kiedy ich wywołanie się powiedzie, dlatego wartość zmiennej errno po bezbłędnym wykonaniu funkcji nie musi być zerowa. Nie należy zatem używać errno w celu stwierdzenia, czy dane wywołanie funkcji się powiodło. Jeżeli będzie miało miejsce niepowodzenie, funkcja sama powinna to zakomunikować.
Najczęściej przyjmowane wartości
*0 - sukces (brak błędu)- EACCES - odmowa dostępu
- EAGAIN - zasób tymczasowo niedostępny
- EBADF - niepoprawny deskryptor plików
- ECANCELED - operacja anulowana
- EDOM - błąd zakresu argumentów przy wywoływaniu funkcji matematycznych
- EEXIST - plik istnieje
- EILSEQ - napotkano błędną reprezentację wielobajtowego znaku
- EINTR - podczas wykonywania funkcji nastąpiło przerwanie
- EINVAL - błędny argument
- EMFILE - za dużo otwartych plików
- ENOENT - nie ma takiego pliku albo katalogu
- ENOMEM - brak miejsca w pamięci
- ENOTEMPTY - katalog nie jest pusty
- ENOTSUP - operacja nie jest zaimplementowana
- EPERM - operacja nie dozwolona
- EPIPE - przerwany potok
- ERANGE - wynik działania funkcji matematycznych nie mieści się w typie wyniku
Przykład wykorzystania zmiennej globalnej errno
#include <stdio.h> #include <stdlib.h> #include <errno.h> int main (int argc, char* argv[]) { int liczba; printf ("Prosze podac dowolna liczbe: \n"); if ( scanf ("%d", &liczba) == 0 ) { errno = EINVAL; perror ("Nie udalo sie podniesc liczby do kwadratu"); return 1; } else liczba *= liczba; printf ("Podana liczba, podniesiona do kwadratu daje: %d\n", liczba); return 0; }
Powyższy przykład jest iście banalny i ma za zadanie podnieść podaną liczbę do kwadratu.
W przypadku podania dwójki, działanie funkcji będzie wyglądało następująco:
Prosze podac dowolna liczbe:
2
Podana liczba, podniesiona do kwadratu daje: 4
Podanie nieprawidłowej wartości, np. znaku '@' będzie skutkowało błędem:
Prosze podac dowolna liczbe:
@
Nie udalo sie podniesc liczby do kwadratu: Invalid argument
W celu poinformowania użytkownika o błędzie możemy użyć funkcji perror. Opis danego błędu możemy uzyskać za pomocą funkcji strerror lub strerror_r. Jak widać perror po dwukropku sam dodaje treść błędu, zapisanego pod zmienną errno.
Zobacz też:
Kategoria: C/C++