Рубрики

Обработка ошибок в программах на Си

Хотя C не обеспечивает прямой поддержки обработки ошибок (или обработки исключений), существуют способы, с помощью которых обработка ошибок может быть осуществлена в C. Программист должен в первую очередь предотвращать ошибки и тестировать возвращаемые значения из функций.
Многие вызовы функций C возвращают -1 или NULL в случае ошибки, поэтому быстрое тестирование этих возвращаемых значений легко выполнить, например, с помощью оператора if. Например, в Socket Programming возвращаемое значение функций, таких как socket (), listen () и т. Д., Проверяется на наличие ошибки или нет.

Пример: обработка ошибок в программировании сокетов

if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
   perror("socket failed");
   exit(EXIT_FAILURE);
}

Различные методы обработки ошибок в C

  1. Глобальная переменная errno: когда в C вызывается функция, переменной с именем errno автоматически присваивается код (значение), который можно использовать для определения типа возникшей ошибки. Это глобальная переменная, указывающая, что ошибка произошла во время любого вызова функции и определена в заголовочном файле errno.h.
    Разные коды (значения) для errno означают разные типы ошибок. Ниже приведен список из нескольких различных значений errno и соответствующего значения:
    errno value       Error
    1             /* Operation not permitted */
    2             /* No such file or directory */
    3             /* No such process */
    4             /* Interrupted system call */
    5             /* I/O error */
    6             /* No such device or address */
    7             /* Argument list too long */
    8             /* Exec format error */
    9             /* Bad file number */
    10            /* No child processes */
    11            /* Try again */
    12            /* Out of memory */
    13            /* Permission denied */
    
    

    // Реализация C, чтобы увидеть, как значение errno
    // установить в случае любой ошибки в C
    #include <stdio.h>
    #include <errno.h>

      

    int main()

    {

        // Если файл открыт, который не существует,

        // тогда это будет ошибка и соответствующая

        // значение errno будет установлено

        FILE * fp;

      

        // открываем файл который

        // не существует.

        fp = fopen("GeeksForGeeks.txt", "r");

      

        printf(" Value of errno: %d\n ", errno);

      

        return 0;

    }

    Выход:

    Value of errno: 2
    

    Примечание. Здесь значение errno установлено в 2, что означает — Нет такого файла или каталога. В онлайн-среде IDE может выдаваться ошибка № 13, в которой говорится, что разрешение отклонено.

  2. perror () и strerror (): приведенное выше значение errno указывает типы возникших ошибок.
    Если требуется показать описание ошибки, то есть две функции, которые можно использовать для отображения текстового сообщения, связанного с errorno. Функции:
    • perror: отображает строку, которую вы передаете ей, затем двоеточие, пробел, а затем текстовое представление текущего значения errno.
      Синтаксис:
      void perror (const char *str)
      str: is a string containing a custom message
      to be printed before the error message itself.
    • strerror (): возвращает указатель на текстовое представление текущего значения errno.
      Синтаксис:
      char *strerror (int errnum)
      errnum: is the error number (errno).

    // Реализация C, чтобы увидеть, как perror () и strerror ()
    // функции используются для печати сообщений об ошибках.
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>

      

    int main ()

    {

        FILE *fp;

      

        // Если файл открыт, который не существует,

        // тогда это будет ошибка и соответствующая

        // значение errno будет установлено

        fp = fopen(" GeeksForGeeks.txt ", "r");

      

        // открываем файл который

        // не существует.

        printf("Value of errno: %d\n ", errno);

        printf("The error message is : %s\n"

                             strerror(errno));

        perror("Message from perror");

      

        return 0;

    }

    Выход:
    На личном рабочем столе:

    Value of errno: 2
    The error message is : No such file or directory
    Message from perror: No such file or directory
    

    В онлайн IDE:

     Value of errno: 13
    The error message is : Permission denied
    

    Примечание . Функция perror () отображает переданную ей строку, за которой следует двоеточие и текстовое сообщение с текущим значением errno.

  3. Состояние выхода: Стандарт C определяет две константы: EXIT_SUCCESS и EXIT_FAILURE, которые могут быть переданы в exit () для указания успешного или неудачного завершения, соответственно. Это макросы, определенные в stdlib.h.

    // C реализация, которая показывает
    // использование EXIT_SUCCESS и EXIT_FAILURE.
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <stdlib.h>

      

    int main ()

    {

        FILE * fp;

        fp = fopen ("filedoesnotexist.txt", "rb");

      

        if (fp == NULL)

        {

            printf("Value of errno: %d\n", errno);

            printf("Error opening the file: %s\n",

                                 strerror(errno));

            perror("Error printed by perror");

      

            exit(EXIT_FAILURE);

            printf("I will not be printed\n");

        }

      

        else

        {

            fclose (fp);

            exit(EXIT_SUCCESS);

            printf("I will not be printed\n");

        }

        return 0;

    }

    Выход:

    Value of errno: 2
    Error opening the file: No such file or directory
    Error printed by perror: No such file or directory
    
  4. Ошибки деления на ноль: распространенная ошибка программистов на Си не проверяет, равен ли делитель нулю перед командой деления. Деление на ноль приводит к неопределенному поведению, нет никакой конструкции языка C, которая могла бы с этим что-либо делать. Лучше всего не делить на ноль в первую очередь, проверяя знаменатель.

    // C программа для проверки и исправления
    // делим на ноль
    #include<stdio.h>
    #include <stdlib.h>

      

    void function(int);

      

    int main()

    {

        int x = 0;

        function(x);

        return 0;

    }

      

    void function(int x)

    {

        float fx;

      

        if (x==0)

        {

            printf("Division by Zero is not allowed");

            fprintf(stderr, "Division by zero! Exiting...\n");

            exit(EXIT_FAILURE);

        }

        else

        {

            fx = 10 / x;

            printf("f(x) is: %.5f", fx);

        }

    }

    Выход:

    Division by Zero is not allowed

Эта статья предоставлена МАЖАР ИМАМ ХАН . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Обработка ошибок в программах на Си

0.00 (0%) 0 votes