czwartek, 26 kwietnia 2018

Język C - Obsługa błędów


C - Obsługa błędów

W związku z tym programowanie w języku C nie zapewnia bezpośredniej obsługi błędów, ale jest językiem programowania systemu, zapewnia on dostęp na niższym poziomie w postaci wartości zwracanych. Większość wywołań funkcji C lub nawet Uniksowych zwraca -1 lub NULL w przypadku jakiegokolwiek błędu i ustawia błąd typu  errno. Jest ustawiona jako zmienna globalna i wskazuje na błąd występujący podczas każdego wywołania funkcji. Możesz znaleźć różne kody błędów zdefiniowane w pliku nagłówkowym <error.h>.
Zatem programista C może sprawdzić zwrócone wartości i może podjąć odpowiednie działania w zależności od zwracanej wartości. Dobrą praktyką jest ustawienie wartości errno na 0 podczas inicjowania programu. Wartość 0 wskazuje, że nie ma błędu w programie.

errno, perror(). i strerror()

Język programowania C udostępnia funkcje perror() i strerror(), które mogą być używane do wyświetlania komunikatu tekstowego związanego z errno.
·      Funkcja perror() wyświetla ciąg znaków, który do niego przechodzi, a następnie dwukropek, spację, a następnie tekstową reprezentację bieżącej wartości errno.
·      Funkcja strerror(), która zwraca wskaźnik do tekstowej reprezentacji bieżącej wartości errno.
Spróbujmy zasymulować warunek błędu i spróbuj otworzyć plik, który nie istnieje. Tutaj używam obu funkcji, aby pokazać użycie, ale możesz użyć jednego lub więcej sposobów drukowania błędów. Drugą ważną rzeczą, na którą należy zwrócić uwagę, jest to, że powinieneś używać strumienia plików stderr do wyprowadzania wszystkich błędów.
#include <stdio.h>
#include <errno.h>
#include <string.h>

extern int errno ;

int main () {

   FILE * pf;
   int errnumer;
   pf = fopen ("test.txt", "rb");
       
   if (pf == NULL) {
  
      errnumer = errno;
      fprintf(stderr, "Wartosc errno: %d\n", errno);
      perror("Błąd wydrukowany przez perror ");
      fprintf(stderr, "Błąd podczas otwierania pliku: %s\n", strerror( errnumer ));
   } else {
  
      fclose (pf);
   }
  
   return 0;
}
Gdy powyższy kod zostanie skompilowany i wykonany, wygeneruje się następujący wynik:
Wartosc errno: 2
Błąd wydrukowany przez perror: Brak takiego pliku lub katalogu
Błąd otwierania pliku: Brak takiego pliku lub katalogu

Błąd dzielenia przez zero

Powszechnym problemem jest to, że w momencie dzielenia dowolnej liczby programiści nie sprawdzają, czy dzielnik jest równy zero i ostatecznie tworzy się błąd wykonania.
Poniższy kod naprawia to poprzez sprawdzenie, czy dzielnik jest zerowy przed dzieleniem:
#include <stdio.h>
#include <stdlib.h>

main() {

   int dzielna = 20;
   int dzielnik = 0;
   int iloraz;

   if( dzielnik == 0){
      fprintf(stderr, "Dzielenie przez zero! Wychodzę...\n");
      exit(-1);
   }
  
   quotient = dzielna / dzielnik;
   fprintf(stderr, "Wartość ilorazu : %d\n", iloraz );

   exit(0);
}
Gdy powyższy kod zostanie skompilowany i wykonany, wygeneruje się następujący wynik:
Dzielenie przez zero! Wychodzę...

Status wyjścia programu

Powszechną praktyką jest wyjście z wartością EXIT_SUCCESS w przypadku wyjścia programu po udanej operacji. Tutaj EXIT_SUCCESS jest makrem i jest zdefiniowane jako 0.
Jeśli masz w swoim programie warunek błędu i wychodzisz, powinieneś wyjść ze statusem EXIT_FAILURE, który jest zdefiniowany jako -1. Napiszmy więc powyższy program w następujący sposób:
#include <stdio.h>
#include <stdlib.h>

main() {

   int dzielna = 20;
   int dzielnik = 5;
   int iloraz;

   if( dzielnik == 0) {
      fprintf(stderr, " Dzielenie przez zero! Wychodzę...\n");
      exit(EXIT_FAILURE);
   }
       
   iloraz = dzielna / dzielnik;
   fprintf(stderr, " Wartość ilorazu: %d\n", iloraz );

   exit(EXIT_SUCCESS);
}
Gdy powyższy kod zostanie skompilowany i wykonany, wygeneruje się następujący wynik:
Wartość ilorazu: 4


Poprzednia strona                                                          Następna strona




Brak komentarzy:

Prześlij komentarz