Latest web development tutorials

C Obsługa błędów

Język C nie zapewnia bezpośrednie wsparcie dla obsługi błędów, ale jako język programowania systemów, zwraca wartość formy pozwala na dostęp do danych źródłowych. W przypadku wystąpienia błędu, większość wywołaniu funkcji UNIX lub C zwraca 1 lub NULL, kod błędu będzie również ustawićwartość errno, to kod błędu jest zmienną globalną, to wyrażony w czasie wywołania funkcji błędu doszło.Można znaleźć wiele błędów kody <error.h> plik nagłówka.

Dlatego programiści C mogą zwracać wartości, sprawdzając, co właściwe działania i podejmowania decyzji w oparciu o wartości zwracanej. Deweloperzy powinni przy inicjalizacji programu, errno wartość 0, co jest dobrą praktyką programowania. Wartość 0 oznacza, że ​​program nie ma błędów.

errno, perror () i strerror ()

Języka C zapewniaperror () oraz funkcję strerror (),aby wyświetlić wiadomość tekstową powiązaną zerrno.

  • Funkcjaperror (), aby pokazać swoją kartę swój ciąg, a następnie dwukropek, spacja i reprezentacji tekstu bieżącej wartości errno.
  • Funkcjastrerror () zwraca wskaźnik do wartości bieżącej reprezentacji tekstowej errno.

Załóżmy symulować fałszywe przypadku próby otwarcia pliku, który nie istnieje. Można używać na kilka sposobów wyjścia komunikat o błędzie, tu użyć funkcji do wykazania użycie. Inną rzeczą, aby pamiętać, że należy użyć pliku wyjściowego strumieniastderr do wszystkich błędów.

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

extern int errno ;

int main ()
{
   FILE * pf;
   int errnum;
   pf = fopen ("unexist.txt", "rb");
   if (pf == NULL)
   {
      errnum = errno;
      fprintf(stderr, "错误号: %d\n", errno);
      perror("通过 perror 输出错误");
      fprintf(stderr, "打开文件错误: %s\n", strerror( errnum ));
   }
   else
   {
      fclose (pf);
   }
   return 0;
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

错误号: 2
通过 perror 输出错误: No such file or directory
打开文件错误: No such file or directory

Dzielenie przez zero błąd

Podczas podziału, dzielnik jest zero, jeśli nie jest zaznaczone, będzie skutkowało błędem wykonawczym.

Aby temu zapobiec, następujący kod przed dokonaniem podziału najpierw sprawdzi dzielnik jest zero:

#include <stdio.h>
#include <stdlib.h>

main()
{
   int dividend = 20;
   int divisor = 0;
   int quotient;
 
   if( divisor == 0){
      fprintf(stderr, "除数为 0 退出运行...\n");
      exit(-1);
   }
   quotient = dividend / divisor;
   fprintf(stderr, "quotient 变量的值为 : %d\n", quotient );

   exit(0);
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

除数为 0 退出运行...

Kodem zakończenia programu

W normalnych warunkach, skuteczna realizacja programu po normalnym czasie pracy wyjdzie o wartości EXIT_SUCCESS. Tutaj EXIT_SUCCESS makro, która jest definiowana jako 0.

Jeśli jest to błąd w programie, po zamknięciu programu, będzie prowadzić wartość statusu EXIT_FAILURE, jest zdefiniowany jako -1. W związku z tym, powyższe postępowanie może być zapisana jako:

#include <stdio.h>
#include <stdlib.h>

main()
{
   int dividend = 20;
   int divisor = 5;
   int quotient;
 
   if( divisor == 0){
      fprintf(stderr, "除数为 0 退出运行...\n");
      exit(EXIT_FAILURE);
   }
   quotient = dividend / divisor;
   fprintf(stderr, "quotient 变量的值为: %d\n", quotient );

   exit(EXIT_SUCCESS);
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

quotient 变量的值为 : 4